diff --git a/.gitignore b/.gitignore index c4e15e9d..b16e3d0b 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ *.out *.toc *.synctex.gz +**/model_data \ No newline at end of file diff --git a/README.md b/README.md index 0d4a7866..d6a5b581 100644 --- a/README.md +++ b/README.md @@ -26,19 +26,34 @@ predictive and fabricable technologies. # Basic Setup +## Docker Image + +We have a pre-configured Ubuntu [Docker](https://www.docker.com/) image +available that has all tools installed for the [SCMOS] process. It is +available at [docker hub](https://hub.docker.com/r/vlsida/openram-ubuntu). +Please see +[our README.md](https://github.com/VLSIDA/openram-docker-images/blob/master/README.md) +for information on how to use this docker image. + +## Dependencies + The OpenRAM compiler has very few dependencies: + [Ngspice] 26 (or later) or HSpice I-2013.12-1 (or later) or CustomSim 2017 (or later) + Python 3.5 or higher + Python numpy (pip3 install numpy to install) ++ Python scipy (pip3 install scipy to install) If you want to perform DRC and LVS, you will need either: + Calibre (for [FreePDK45]) -+ [Magic] + [Netgen] (for [SCMOS]) ++ [Magic] 8.2.79 or higher (for [SCMOS]) ++ [Netgen] 1.5 (for [SCMOS]) You must set two environment variables: + OPENRAM\_HOME should point to the compiler source directory. + OPENERAM\_TECH should point to a root technology directory. +## Environment + For example add this to your .bashrc: ``` diff --git a/compiler/base/contact.py b/compiler/base/contact.py index f5cfcb0b..39cb7b52 100644 --- a/compiler/base/contact.py +++ b/compiler/base/contact.py @@ -162,7 +162,7 @@ class contact(hierarchy_design.hierarchy_design): width=well_width, height=well_height) - def analytical_power(self, proc, vdd, temp, load): + def analytical_power(self, corner, load): """ Get total power of a module """ return self.return_power() diff --git a/compiler/base/design.py b/compiler/base/design.py index d07e392a..4e76b40a 100644 --- a/compiler/base/design.py +++ b/compiler/base/design.py @@ -88,11 +88,11 @@ class design(hierarchy_design): self.readonly_ports.append(port_number) port_number += 1 - def analytical_power(self, proc, vdd, temp, load): + def analytical_power(self, corner, load): """ Get total power of a module """ total_module_power = self.return_power() for inst in self.insts: - total_module_power += inst.mod.analytical_power(proc, vdd, temp, load) + total_module_power += inst.mod.analytical_power(corner, load) return total_module_power def __str__(self): diff --git a/compiler/base/hierarchy_design.py b/compiler/base/hierarchy_design.py index 7f30fb1c..1dc052e3 100644 --- a/compiler/base/hierarchy_design.py +++ b/compiler/base/hierarchy_design.py @@ -73,8 +73,8 @@ class hierarchy_design(hierarchy_spice.spice, hierarchy_layout.layout): global total_drc_errors global total_lvs_errors - tempspice = OPTS.openram_temp + "/temp.sp" - tempgds = OPTS.openram_temp + "/temp.gds" + tempspice = "{0}/{1}.sp".format(OPTS.openram_temp,self.name) + tempgds = "{0}/{1}.gds".format(OPTS.openram_temp,self.name) self.sp_write(tempspice) self.gds_write(tempgds) @@ -95,7 +95,7 @@ class hierarchy_design(hierarchy_spice.spice, hierarchy_layout.layout): if (not OPTS.is_unit_test and OPTS.check_lvsdrc and (OPTS.inline_lvsdrc or final_verification)): global total_drc_errors - tempgds = OPTS.openram_temp + "/temp.gds" + tempgds = "{0}/{1}.gds".format(OPTS.openram_temp,self.name) self.gds_write(tempgds) num_errors = verify.run_drc(self.name, tempgds, final_verification) total_drc_errors += num_errors @@ -110,8 +110,8 @@ class hierarchy_design(hierarchy_spice.spice, hierarchy_layout.layout): if (not OPTS.is_unit_test and OPTS.check_lvsdrc and (OPTS.inline_lvsdrc or final_verification)): global total_lvs_errors - tempspice = OPTS.openram_temp + "/temp.sp" - tempgds = OPTS.openram_temp + "/temp.gds" + tempspice = "{0}/{1}.sp".format(OPTS.openram_temp,self.name) + tempgds = "{0}/{1}.gds".format(OPTS.openram_temp,self.name) self.sp_write(tempspice) self.gds_write(tempgds) num_errors = verify.run_lvs(self.name, tempgds, tempspice, final_verification) diff --git a/compiler/base/hierarchy_spice.py b/compiler/base/hierarchy_spice.py index 424e4d94..5f3245a8 100644 --- a/compiler/base/hierarchy_spice.py +++ b/compiler/base/hierarchy_spice.py @@ -2,6 +2,7 @@ import debug import re import os import math +import tech class spice(): """ @@ -218,7 +219,7 @@ class spice(): del usedMODS spfile.close() - def analytical_delay(self, slew, load=0.0): + def analytical_delay(self, corner, slew, load=0.0): """Inform users undefined delay module while building new modules""" debug.warning("Design Class {0} delay function needs to be defined" .format(self.__class__.__name__)) @@ -228,15 +229,21 @@ class spice(): # return 0 to keep code running while building return delay_data(0.0, 0.0) - def cal_delay_with_rc(self, r, c ,slew, swing = 0.5): + def cal_delay_with_rc(self, corner, r, c ,slew, swing = 0.5): """ Calculate the delay of a mosfet by modeling it as a resistance driving a capacitance """ swing_factor = abs(math.log(1-swing)) # time constant based on swing + proc,vdd,temp = corner + #FIXME: type of delay is needed to know which process to use. + proc_mult = max(self.get_process_delay_factor(proc)) + volt_mult = self.get_voltage_delay_factor(vdd) + temp_mult = self.get_temp_delay_factor(temp) delay = swing_factor * r * c #c is in ff and delay is in fs + delay = delay * proc_mult * volt_mult * temp_mult delay = delay * 0.001 #make the unit to ps - + # Output slew should be linear to input slew which is described # as 0.005* slew. @@ -247,6 +254,36 @@ class spice(): slew = delay * 0.6 * 2 + 0.005 * slew return delay_data(delay = delay, slew = slew) + def get_process_delay_factor(self, proc): + """Returns delay increase estimate based off process + Currently does +/-10 for fast/slow corners.""" + proc_factors = [] + for mos_proc in proc: + if mos_proc == 'T': + proc_factors.append(1.0) + elif mos_proc == 'F': + proc_factors.append(0.9) + elif mos_proc == 'S': + proc_factors.append(1.1) + return proc_factors + + def get_voltage_delay_factor(self, voltage): + """Returns delay increase due to voltage. + Implemented as linear factor based off nominal voltage. + """ + return tech.spice['vdd_nominal']/voltage + + def get_temp_delay_factor(self, temp): + """Returns delay increase due to temperature (in C). + Determines effect on threshold voltage and then linear factor is estimated. + """ + #Some portions of equation condensed (phi_t = k*T/q for T in Kelvin) in mV + #(k/q)/100 = .008625, The division 100 simplifies the conversion from C to K and mV to V + thermal_voltage_nom = .008625*tech.spice["temp_nominal"] + thermal_voltage = .008625*temp + vthresh = (tech.spice["v_threshold_typical"]+2*(thermal_voltage-thermal_voltage_nom)) + #Calculate effect on Vdd-Vth. The current vdd is not used here. A separate vdd factor is calculated. + return (tech.spice['vdd_nominal'] - tech.spice["v_threshold_typical"])/(tech.spice['vdd_nominal']-vthresh) def return_delay(self, delay, slew): return delay_data(delay, slew) @@ -254,6 +291,22 @@ class spice(): def generate_rc_net(self,lump_num, wire_length, wire_width): return wire_spice_model(lump_num, wire_length, wire_width) + def calc_dynamic_power(self, corner, c, freq, swing=1.0): + """ + Calculate dynamic power using effective capacitance, frequency, and corner (PVT) + """ + proc,vdd,temp = corner + net_vswing = vdd*swing + power_dyn = c*vdd*net_vswing*freq + + #Apply process and temperature factors. Roughly, process and Vdd affect the delay which affects the power. + #No other estimations are currently used. Increased delay->slower freq.->less power + proc_div = max(self.get_process_delay_factor(proc)) + temp_div = self.get_temp_delay_factor(temp) + power_dyn = power_dyn/(proc_div*temp_div) + + return power_dyn + def return_power(self, dynamic=0.0, leakage=0.0): return power_data(dynamic, leakage) diff --git a/compiler/bitcells/bitcell.py b/compiler/bitcells/bitcell.py index 3c49a959..ed1647a8 100644 --- a/compiler/bitcells/bitcell.py +++ b/compiler/bitcells/bitcell.py @@ -24,7 +24,7 @@ class bitcell(design.design): self.height = bitcell.height self.pin_map = bitcell.pin_map - def analytical_delay(self, slew, load=0, swing = 0.5): + def analytical_delay(self, corner, slew, load=0, swing = 0.5): # delay of bit cell is not like a driver(from WL) # so the slew used should be 0 # it should not be slew dependent? @@ -33,7 +33,7 @@ class bitcell(design.design): from tech import spice r = spice["min_tx_r"]*3 c_para = spice["min_tx_drain_c"] - result = self.cal_delay_with_rc(r = r, c = c_para+load, slew = slew, swing = swing) + result = self.cal_delay_with_rc(corner, r = r, c = c_para+load, slew = slew, swing = swing) return result @@ -66,7 +66,7 @@ class bitcell(design.design): column_pins = ["br"] return column_pins - def analytical_power(self, proc, vdd, temp, load): + def analytical_power(self, corner, load): """Bitcell power in nW. Only characterizes leakage.""" from tech import spice leakage = spice["bitcell_leakage"] diff --git a/compiler/bitcells/bitcell_1rw_1r.py b/compiler/bitcells/bitcell_1rw_1r.py index 79dc734c..a96dcff0 100644 --- a/compiler/bitcells/bitcell_1rw_1r.py +++ b/compiler/bitcells/bitcell_1rw_1r.py @@ -24,7 +24,7 @@ class bitcell_1rw_1r(design.design): self.height = bitcell_1rw_1r.height self.pin_map = bitcell_1rw_1r.pin_map - def analytical_delay(self, slew, load=0, swing = 0.5): + def analytical_delay(self, corner, slew, load=0, swing = 0.5): # delay of bit cell is not like a driver(from WL) # so the slew used should be 0 # it should not be slew dependent? @@ -33,7 +33,7 @@ class bitcell_1rw_1r(design.design): from tech import spice r = spice["min_tx_r"]*3 c_para = spice["min_tx_drain_c"] - result = self.cal_delay_with_rc(r = r, c = c_para+load, slew = slew, swing = swing) + result = self.cal_delay_with_rc(corner, r = r, c = c_para+load, slew = slew, swing = swing) return result @@ -89,7 +89,7 @@ class bitcell_1rw_1r(design.design): column_pins = ["br0"] return column_pins - def analytical_power(self, proc, vdd, temp, load): + def analytical_power(self, corner, load): """Bitcell power in nW. Only characterizes leakage.""" from tech import spice leakage = spice["bitcell_leakage"] diff --git a/compiler/bitcells/bitcell_1w_1r.py b/compiler/bitcells/bitcell_1w_1r.py new file mode 100644 index 00000000..e2cc662b --- /dev/null +++ b/compiler/bitcells/bitcell_1w_1r.py @@ -0,0 +1,106 @@ +import design +import debug +import utils +from tech import GDS,layer,parameter,drc + +class bitcell_1w_1r(design.design): + """ + A single bit cell (6T, 8T, etc.) This module implements the + single memory cell used in the design. It is a hand-made cell, so + the layout and netlist should be available in the technology + library. + """ + + pin_names = ["bl0", "br0", "bl1", "br1", "wl0", "wl1", "vdd", "gnd"] + (width,height) = utils.get_libcell_size("cell_1w_1r", GDS["unit"], layer["boundary"]) + pin_map = utils.get_libcell_pins(pin_names, "cell_1w_1r", GDS["unit"]) + + def __init__(self, name=""): + # Ignore the name argument + design.design.__init__(self, "cell_1w_1r") + debug.info(2, "Create bitcell with 1W and 1R Port") + + self.width = bitcell_1w_1r.width + self.height = bitcell_1w_1r.height + self.pin_map = bitcell_1w_1r.pin_map + + def analytical_delay(self, corner, slew, load=0, swing = 0.5): + # delay of bit cell is not like a driver(from WL) + # so the slew used should be 0 + # it should not be slew dependent? + # because the value is there + # the delay is only over half transsmission gate + from tech import spice + r = spice["min_tx_r"]*3 + c_para = spice["min_tx_drain_c"] + result = self.cal_delay_with_rc(corner, r = r, c = c_para+load, slew = slew, swing = swing) + return result + + + def list_bitcell_pins(self, col, row): + """ Creates a list of connections in the bitcell, indexed by column and row, for instance use in bitcell_array """ + bitcell_pins = ["bl0_{0}".format(col), + "br0_{0}".format(col), + "bl1_{0}".format(col), + "br1_{0}".format(col), + "wl0_{0}".format(row), + "wl1_{0}".format(row), + "vdd", + "gnd"] + return bitcell_pins + + def list_all_wl_names(self): + """ Creates a list of all wordline pin names """ + row_pins = ["wl0", "wl1"] + return row_pins + + def list_all_bitline_names(self): + """ Creates a list of all bitline pin names (both bl and br) """ + column_pins = ["bl0", "br0", "bl1", "br1"] + return column_pins + + def list_all_bl_names(self): + """ Creates a list of all bl pins names """ + column_pins = ["bl0", "bl1"] + return column_pins + + def list_all_br_names(self): + """ Creates a list of all br pins names """ + column_pins = ["br0", "br1"] + return column_pins + + def list_read_bl_names(self): + """ Creates a list of bl pin names associated with read ports """ + column_pins = ["bl0", "bl1"] + return column_pins + + def list_read_br_names(self): + """ Creates a list of br pin names associated with read ports """ + column_pins = ["br0", "br1"] + return column_pins + + def list_write_bl_names(self): + """ Creates a list of bl pin names associated with write ports """ + column_pins = ["bl0"] + return column_pins + + def list_write_br_names(self): + """ Creates a list of br pin names asscociated with write ports""" + column_pins = ["br0"] + return column_pins + + def analytical_power(self, corner, load): + """Bitcell power in nW. Only characterizes leakage.""" + from tech import spice + leakage = spice["bitcell_leakage"] + dynamic = 0 #temporary + total_power = self.return_power(dynamic, leakage) + return total_power + + def get_wl_cin(self): + """Return the relative capacitance of the access transistor gates""" + #This is a handmade cell so the value must be entered in the tech.py file or estimated. + #Calculated in the tech file by summing the widths of all the related gates and dividing by the minimum width. + #FIXME: sizing is not accurate with the handmade cell. Change once cell widths are fixed. + access_tx_cin = parameter["6T_access_size"]/drc["minwidth_tx"] + return 2*access_tx_cin diff --git a/compiler/bitcells/pbitcell.py b/compiler/bitcells/pbitcell.py index b241471d..55712e44 100644 --- a/compiler/bitcells/pbitcell.py +++ b/compiler/bitcells/pbitcell.py @@ -866,15 +866,15 @@ class pbitcell(design.design): vdd_pos = self.inverter_pmos_right.get_pin("D").center() self.add_path("metal1", [Q_bar_pos, vdd_pos]) - def analytical_delay(self, slew, load=0, swing = 0.5): + def analytical_delay(self, corner, slew, load=0, swing = 0.5): #FIXME: Delay copied exactly over from bitcell from tech import spice r = spice["min_tx_r"]*3 c_para = spice["min_tx_drain_c"] - result = self.cal_delay_with_rc(r = r, c = c_para+load, slew = slew, swing = swing) + result = self.cal_delay_with_rc(corner, r = r, c = c_para+load, slew = slew, swing = swing) return result - def analytical_power(self, proc, vdd, temp, load): + def analytical_power(self, corner, load): """Bitcell power in nW. Only characterizes leakage.""" from tech import spice leakage = spice["bitcell_leakage"] diff --git a/compiler/bitcells/replica_bitcell_1w_1r.py b/compiler/bitcells/replica_bitcell_1w_1r.py new file mode 100644 index 00000000..6f59adec --- /dev/null +++ b/compiler/bitcells/replica_bitcell_1w_1r.py @@ -0,0 +1,32 @@ +import design +import debug +import utils +from tech import GDS,layer,drc,parameter + +class replica_bitcell_1w_1r(design.design): + """ + A single bit cell which is forced to store a 0. + This module implements the single memory cell used in the design. It + is a hand-made cell, so the layout and netlist should be available in + the technology library. """ + + pin_names = ["bl0", "br0", "bl1", "br1", "wl0", "wl1", "vdd", "gnd"] + (width,height) = utils.get_libcell_size("replica_cell_1w_1r", GDS["unit"], layer["boundary"]) + pin_map = utils.get_libcell_pins(pin_names, "replica_cell_1w_1r", GDS["unit"]) + + def __init__(self, name=""): + # Ignore the name argument + design.design.__init__(self, "replica_cell_1w_1r") + debug.info(2, "Create replica bitcell 1w+1r object") + + self.width = replica_bitcell_1w_1r.width + self.height = replica_bitcell_1w_1r.height + self.pin_map = replica_bitcell_1w_1r.pin_map + + def get_wl_cin(self): + """Return the relative capacitance of the access transistor gates""" + #This is a handmade cell so the value must be entered in the tech.py file or estimated. + #Calculated in the tech file by summing the widths of all the related gates and dividing by the minimum width. + #FIXME: sizing is not accurate with the handmade cell. Change once cell widths are fixed. + access_tx_cin = parameter["6T_access_size"]/drc["minwidth_tx"] + return 2*access_tx_cin diff --git a/compiler/characterizer/__init__.py b/compiler/characterizer/__init__.py index 19da7d59..fc42a889 100644 --- a/compiler/characterizer/__init__.py +++ b/compiler/characterizer/__init__.py @@ -9,6 +9,8 @@ from .functional import * from .worst_case import * from .simulation import * from .bitline_delay import * +from .measurements import * +from .model_check import * debug.info(1,"Initializing characterizer...") OPTS.spice_exe = "" diff --git a/compiler/characterizer/bitline_delay.py b/compiler/characterizer/bitline_delay.py index e5a50c16..c85f06bc 100644 --- a/compiler/characterizer/bitline_delay.py +++ b/compiler/characterizer/bitline_delay.py @@ -22,11 +22,24 @@ class bitline_delay(delay): self.period = tech.spice["feasible_period"] self.is_bitline_measure = True + def create_signal_names(self): + delay.create_signal_names(self) + self.bl_signal_names = ["Xsram.Xbank0.bl", "Xsram.Xbank0.br"] + self.sen_name = "Xsram.s_en" + def create_measurement_names(self): """Create measurement names. The names themselves currently define the type of measurement""" #Altering the names will crash the characterizer. TODO: object orientated approach to the measurements. - self.bitline_meas_names = ["bl_volt", "br_volt"] + self.bl_volt_meas_names = ["volt_bl", "volt_br"] + self.bl_delay_meas_names = ["delay_bl", "delay_br"] #only used in SPICE simulation + self.bl_delay_result_name = "delay_bl_vth" #Used in the return value + def set_probe(self,probe_address, probe_data): + """ Probe address and data can be set separately to utilize other + functions in this characterizer besides analyze.""" + delay.set_probe(self,probe_address, probe_data) + self.bitline_column = self.get_data_bit_column_number(probe_address, probe_data) + def write_delay_measures(self): """ Write the measure statements to quantify the bitline voltage at sense amp enable 50%. @@ -38,26 +51,52 @@ class bitline_delay(delay): self.sf.write("* {}\n".format(comment)) for read_port in self.targ_read_ports: - self.write_bitline_measures_read_port(read_port) + self.write_bitline_voltage_measures(read_port) + self.write_bitline_delay_measures(read_port) - def write_bitline_measures_read_port(self, port): + def write_bitline_voltage_measures(self, port): + """ + Add measurments to capture the bitline voltages at 50% Sense amp enable + """ + debug.info(2, "Measuring bitline column={}, port={}".format(self.bitline_column,port)) + if len(self.all_ports) == 1: #special naming case for single port sram bitlines + bitline_port = "" + else: + bitline_port = str(port) + + sen_port_name = "{}{}".format(self.sen_name,port) + for (measure_name, bl_signal_name) in zip(self.bl_volt_meas_names, self.bl_signal_names): + bl_port_name = "{}{}_{}".format(bl_signal_name, bitline_port, self.bitline_column) + measure_port_name = "{}{}".format(measure_name,port) + self.stim.gen_meas_find_voltage(measure_port_name, sen_port_name, bl_port_name, .5, "RISE", self.cycle_times[self.measure_cycles[port]["read0"]]) + + def write_bitline_delay_measures(self, port): """ Write the measure statements to quantify the delay and power results for a read port. """ # add measure statements for delays/slews - measure_bitline = self.get_data_bit_column_number(self.probe_address, self.probe_data) - debug.info(2, "Measuring bitline column={}".format(measure_bitline)) - for port in self.targ_read_ports: - if len(self.all_ports) == 1: #special naming case for single port sram bitlines - bitline_port = "" - else: - bitline_port = str(port) - - sen_name = "Xsram.s_en{}".format(port) - bl_name = "Xsram.Xbank0.bl{}_{}".format(bitline_port, measure_bitline) - br_name = "Xsram.Xbank0.br{}_{}".format(bitline_port, measure_bitline) - self.stim.gen_meas_find_voltage("bl_volt", sen_name, bl_name, .5, "RISE", self.cycle_times[self.measure_cycles[port]["read0"]]) - self.stim.gen_meas_find_voltage("br_volt", sen_name, br_name, .5, "RISE", self.cycle_times[self.measure_cycles[port]["read0"]]) + for (measure_name, bl_signal_name) in zip(self.bl_delay_meas_names, self.bl_signal_names): + meas_values = self.get_delay_meas_values(measure_name, bl_signal_name, port) + self.stim.gen_meas_delay(*meas_values) + + def get_delay_meas_values(self, delay_name, bitline_name, port): + """Get the values needed to generate a Spice measurement statement based on the name of the measurement.""" + if len(self.all_ports) == 1: #special naming case for single port sram bitlines + bitline_port = "" + else: + bitline_port = str(port) + + meas_name="{0}{1}".format(delay_name, port) + targ_name = "{0}{1}_{2}".format(bitline_name,bitline_port,self.bitline_column) + half_vdd = 0.5 * self.vdd_voltage + trig_val = half_vdd + targ_val = self.vdd_voltage-tech.spice["v_threshold_typical"] + trig_name = "clk{0}".format(port) + trig_dir="FALL" + targ_dir="FALL" + #Half period added to delay measurement to negative clock edge + trig_td = targ_td = self.cycle_times[self.measure_cycles[port]["read0"]] + self.period/2 + return (meas_name,trig_name,targ_name,trig_val,targ_val,trig_dir,targ_dir,trig_td,targ_td) def gen_test_cycles_one_port(self, read_port, write_port): """Sets a list of key time-points [ns] of the waveform (each rising edge) @@ -89,6 +128,7 @@ class bitline_delay(delay): self.add_read("R data 0 address {} to check W0 worked".format(self.probe_address), self.probe_address,data_zeros,read_port) self.measure_cycles[read_port]["read0"] = len(self.cycle_times)-1 + def get_data_bit_column_number(self, probe_address, probe_data): """Calculates bitline column number of data bit under test using bit position and mux size""" if self.sram.col_addr_size>0: @@ -115,19 +155,70 @@ class bitline_delay(delay): self.stim.run_sim() #running sim prodoces spice output file. for port in self.targ_read_ports: - bitlines_meas_vals = {} - for mname in self.bitline_meas_names: - bitlines_meas_vals[mname] = parse_spice_list("timing", mname) - #Check that power parsing worked. - for name, val in bitlines_meas_vals.items(): - if type(val)!=float: - debug.error("Failed to Parse Bitline Values:\n\t\t{0}".format(bitlines_meas_vals),1) #Printing the entire dict looks bad. - result[port].update(bitlines_meas_vals) + #Parse and check the voltage measurements + bl_volt_meas_dict = {} + for mname in self.bl_volt_meas_names: + mname_port = "{}{}".format(mname,port) + volt_meas_val = parse_spice_list("timing", mname_port) + if type(volt_meas_val)!=float: + debug.error("Failed to Parse Bitline Voltage:\n\t\t{0}={1}".format(mname,volt_meas_val),1) + bl_volt_meas_dict[mname] = volt_meas_val + result[port].update(bl_volt_meas_dict) + + #Parse and check the delay measurements. Intended that one measurement will fail, save the delay that did not fail. + bl_delay_meas_dict = {} + values_added = 0 #For error checking + for mname in self.bl_delay_meas_names: #Parse + mname_port = "{}{}".format(mname,port) + delay_meas_val = parse_spice_list("timing", mname_port) + if type(delay_meas_val)==float: #Only add if value is float, do not error. + bl_delay_meas_dict[self.bl_delay_result_name] = delay_meas_val * 1e9 #convert to ns + values_added+=1 + debug.check(values_added>0, "Bitline delay measurements failed in SPICE simulation.") + debug.check(values_added<2, "Both bitlines experienced a Vth drop, check simulation results.") + result[port].update(bl_delay_meas_dict) - # The delay is from the negative edge for our SRAM return (True,result) + def check_bitline_all_results(self, results): + """Checks the bitline values measured for each tested port""" + for port in self.targ_read_ports: + self.check_bitline_port_results(results[port]) + + def check_bitline_port_results(self, port_results): + """Performs three different checks for the bitline values: functionality, bitline swing from vdd, and differential bit swing""" + bl_volt, br_volt = port_results["volt_bl"], port_results["volt_br"] + self.check_functionality(bl_volt,br_volt) + self.check_swing_from_vdd(bl_volt,br_volt) + self.check_differential_swing(bl_volt,br_volt) + + def check_functionality(self, bl_volt, br_volt): + """Checks whether the read failed or not. Measured values are hardcoded with the intention of reading a 0.""" + if bl_volt > br_volt: + debug.error("Read failure. Value 1 was read instead of 0.",1) + + def check_swing_from_vdd(self, bl_volt, br_volt): + """Checks difference on discharging bitline from VDD to see if it is within margin of the RBL height parameter.""" + if bl_volt < br_volt: + discharge_volt = bl_volt + else: + discharge_volt = br_volt + desired_bl_volt = tech.parameter["rbl_height_percentage"]*self.vdd_voltage + debug.info(1, "Active bitline={:.3f}v, Desired bitline={:.3f}v".format(discharge_volt,desired_bl_volt)) + vdd_error_margin = .2 #20% of vdd margin for bitline, a little high for now. + if abs(discharge_volt - desired_bl_volt) > vdd_error_margin*self.vdd_voltage: + debug.warning("Bitline voltage is not within {}% Vdd margin. Delay chain/RBL could need resizing.".format(vdd_error_margin*100)) + + def check_differential_swing(self, bl_volt, br_volt): + """This check looks at the difference between the bitline voltages. This needs to be large enough to prevent + sensing errors.""" + bitline_swing = abs(bl_volt-br_volt) + debug.info(1,"Bitline swing={:.3f}v".format(bitline_swing)) + vdd_error_margin = .2 #20% of vdd margin for bitline, a little high for now. + if bitline_swing < vdd_error_margin*self.vdd_voltage: + debug.warning("Bitline swing less than {}% Vdd margin. Sensing errors more likely to occur.".format(vdd_error_margin)) + def analyze(self, probe_address, probe_data, slews, loads): """Measures the bitline swing of the differential bitlines (bl/br) at 50% s_en """ self.set_probe(probe_address, probe_data) @@ -141,10 +232,10 @@ class bitline_delay(delay): debug.info(1,"Bitline swing test: corner {}".format(self.corner)) (success, results)=self.run_delay_simulation() debug.check(success, "Bitline Failed: period {}".format(self.period)) - for mname in self.bitline_meas_names: - bitline_swings[mname] = results[read_port][mname] - debug.info(1,"Bitline values (bl/br): {}".format(bitline_swings)) - return bitline_swings + debug.info(1,"Bitline values (voltages/delays):\n\t {}".format(results[read_port])) + self.check_bitline_all_results(results) + + return results diff --git a/compiler/characterizer/charutils.py b/compiler/characterizer/charutils.py index a2140e51..061972cf 100644 --- a/compiler/characterizer/charutils.py +++ b/compiler/characterizer/charutils.py @@ -80,3 +80,10 @@ def convert_to_float(number): debug.error("Invalid number: {0}".format(number),1) return float_value + +def check_dict_values_is_float(dict): + """Checks if all the values are floats. Useful for checking failed Spice measurements.""" + for key, value in dict.items(): + if type(value)!=float: + return False + return True \ No newline at end of file diff --git a/compiler/characterizer/delay.py b/compiler/characterizer/delay.py index 9e0543d1..29b12ae9 100644 --- a/compiler/characterizer/delay.py +++ b/compiler/characterizer/delay.py @@ -8,6 +8,7 @@ from .charutils import * import utils from globals import OPTS from .simulation import simulation +from .measurements import * class delay(simulation): """Functions to measure the delay and power of an SRAM at a given address and @@ -35,17 +36,92 @@ class delay(simulation): self.period = 0 self.set_load_slew(0,0) self.set_corner(corner) - self.create_signal_names() - - #Create global measure names. Should maybe be an input at some point. - self.create_measurement_names() def create_measurement_names(self): """Create measurement names. The names themselves currently define the type of measurement""" #Altering the names will crash the characterizer. TODO: object orientated approach to the measurements. self.delay_meas_names = ["delay_lh", "delay_hl", "slew_lh", "slew_hl"] self.power_meas_names = ["read0_power", "read1_power", "write0_power", "write1_power"] + self.voltage_when_names = ["volt_bl", "volt_br"] + self.bitline_delay_names = ["delay_bl", "delay_br"] + + def create_measurement_objects(self): + """Create the measurements used for read and write ports""" + self.create_read_port_measurement_objects() + self.create_write_port_measurement_objects() + + def create_read_port_measurement_objects(self): + """Create the measurements used for read ports: delays, slews, powers""" + self.read_meas_objs = [] + trig_delay_name = "clk{0}" + targ_name = "{0}{1}_{2}".format(self.dout_name,"{}",self.probe_data) #Empty values are the port and probe data bit + self.read_meas_objs.append(delay_measure("delay_lh", trig_delay_name, targ_name, "RISE", "RISE", measure_scale=1e9)) + self.read_meas_objs[-1].meta_str = "read1" #Used to index time delay values when measurements written to spice file. + self.read_meas_objs.append(delay_measure("delay_hl", trig_delay_name, targ_name, "FALL", "FALL", measure_scale=1e9)) + self.read_meas_objs[-1].meta_str = "read0" + + self.read_meas_objs.append(slew_measure("slew_lh", targ_name, "RISE", measure_scale=1e9)) + self.read_meas_objs[-1].meta_str = "read1" + self.read_meas_objs.append(slew_measure("slew_hl", targ_name, "FALL", measure_scale=1e9)) + self.read_meas_objs[-1].meta_str = "read0" + + self.read_meas_objs.append(power_measure("read1_power", "RISE", measure_scale=1e3)) + self.read_meas_objs[-1].meta_str = "read1" + self.read_meas_objs.append(power_measure("read0_power", "FALL", measure_scale=1e3)) + self.read_meas_objs[-1].meta_str = "read0" + + #This will later add a half-period to the spice time delay. Only for reading 0. + for obj in self.read_meas_objs: + if obj.meta_str is "read0": + obj.meta_add_delay = True + + trig_name = "Xsram.s_en{}" #Sense amp enable + if len(self.all_ports) == 1: #special naming case for single port sram bitlines which does not include the port in name + port_format = "" + else: + port_format = "{}" + + bl_name = "Xsram.Xbank0.bl{}_{}".format(port_format, self.bitline_column) + br_name = "Xsram.Xbank0.br{}_{}".format(port_format, self.bitline_column) + self.read_meas_objs.append(voltage_when_measure(self.voltage_when_names[0], trig_name, bl_name, "RISE", .5)) + self.read_meas_objs.append(voltage_when_measure(self.voltage_when_names[1], trig_name, br_name, "RISE", .5)) + + #These are read values but need to be separated for unique error checking. + self.create_bitline_delay_measurement_objects() + + def create_bitline_delay_measurement_objects(self): + """Create the measurements used for bitline delay values. Due to unique error checking, these are separated from other measurements. + These measurements are only associated with read values + """ + self.bitline_delay_objs = [] + trig_name = "clk{0}" + if len(self.all_ports) == 1: #special naming case for single port sram bitlines which does not include the port in name + port_format = "" + else: + port_format = "{}" + bl_name = "Xsram.Xbank0.bl{}_{}".format(port_format, self.bitline_column) + br_name = "Xsram.Xbank0.br{}_{}".format(port_format, self.bitline_column) + targ_val = (self.vdd_voltage - tech.spice["v_threshold_typical"])/self.vdd_voltage #Calculate as a percentage of vdd + + targ_name = "{0}{1}_{2}".format(self.dout_name,"{}",self.probe_data) #Empty values are the port and probe data bit + self.bitline_delay_objs.append(delay_measure(self.bitline_delay_names[0], trig_name, bl_name, "FALL", "FALL", targ_vdd=targ_val, measure_scale=1e9)) + self.bitline_delay_objs[-1].meta_str = "read0" + self.bitline_delay_objs.append(delay_measure(self.bitline_delay_names[1], trig_name, br_name, "FALL", "FALL", targ_vdd=targ_val, measure_scale=1e9)) + self.bitline_delay_objs[-1].meta_str = "read1" + #Enforces the time delay on the bitline measurements for read0 or read1 + for obj in self.bitline_delay_objs: + obj.meta_add_delay = True + + def create_write_port_measurement_objects(self): + """Create the measurements used for read ports: delays, slews, powers""" + self.write_meas_objs = [] + + self.write_meas_objs.append(power_measure("write1_power", "RISE", measure_scale=1e3)) + self.write_meas_objs[-1].meta_str = "write1" + self.write_meas_objs.append(power_measure("write0_power", "FALL", measure_scale=1e3)) + self.write_meas_objs[-1].meta_str = "write0" + def create_signal_names(self): self.addr_name = "A" self.din_name = "DIN" @@ -198,86 +274,75 @@ class delay(simulation): self.sf.close() - def get_delay_meas_values(self, delay_name, port): - """Get the values needed to generate a Spice measurement statement based on the name of the measurement.""" - debug.check('lh' in delay_name or 'hl' in delay_name, "Measure command {0} does not contain direction (lh/hl)") - trig_clk_name = "clk{0}".format(port) - meas_name="{0}{1}".format(delay_name, port) - targ_name = "{0}".format("{0}{1}_{2}".format(self.dout_name,port,self.probe_data)) - half_vdd = 0.5 * self.vdd_voltage - trig_slew_low = 0.1 * self.vdd_voltage - targ_slew_high = 0.9 * self.vdd_voltage - if 'delay' in delay_name: - trig_val = half_vdd - targ_val = half_vdd - trig_name = trig_clk_name - if 'lh' in delay_name: - trig_dir="RISE" - targ_dir="RISE" - trig_td = targ_td = self.cycle_times[self.measure_cycles[port]["read1"]] - else: - trig_dir="FALL" - targ_dir="FALL" - trig_td = targ_td = self.cycle_times[self.measure_cycles[port]["read0"]] - - elif 'slew' in delay_name: - trig_name = targ_name - if 'lh' in delay_name: - trig_val = trig_slew_low - targ_val = targ_slew_high - targ_dir = trig_dir = "RISE" - trig_td = targ_td = self.cycle_times[self.measure_cycles[port]["read1"]] - else: - trig_val = targ_slew_high - targ_val = trig_slew_low - targ_dir = trig_dir = "FALL" - trig_td = targ_td = self.cycle_times[self.measure_cycles[port]["read0"]] + def get_read_measure_variants(self, port, measure_obj): + """Checks the measurement object and calls respective function for related measurement inputs.""" + meas_type = type(measure_obj) + if meas_type is delay_measure or meas_type is slew_measure: + return self.get_delay_measure_variants(port, measure_obj) + elif meas_type is power_measure: + return self.get_power_measure_variants(port, measure_obj, "read") + elif meas_type is voltage_when_measure: + return self.get_volt_when_measure_variants(port, measure_obj) else: - debug.error(1, "Measure command {0} not recognized".format(delay_name)) - return (meas_name,trig_name,targ_name,trig_val,targ_val,trig_dir,targ_dir,trig_td,targ_td) - + debug.error("Input function not defined for measurement type={}".format(meas_type)) + + def get_delay_measure_variants(self, port, delay_obj): + """Get the measurement values that can either vary from simulation to simulation (vdd, address) or port to port (time delays)""" + #Return value is intended to match the delay measure format: trig_td, targ_td, vdd, port + #vdd is arguably constant as that is true for a single lib file. + if delay_obj.meta_str == "read0": + #Falling delay are measured starting from neg. clk edge. Delay adjusted to that. + meas_cycle_delay = self.cycle_times[self.measure_cycles[port][delay_obj.meta_str]] + elif delay_obj.meta_str == "read1": + meas_cycle_delay = self.cycle_times[self.measure_cycles[port][delay_obj.meta_str]] + else: + debug.error("Unrecognised delay Index={}".format(delay_obj.meta_str),1) + + if delay_obj.meta_add_delay: + meas_cycle_delay += self.period/2 + + return (meas_cycle_delay, meas_cycle_delay, self.vdd_voltage, port) + + def get_power_measure_variants(self, port, power_obj, operation): + """Get the measurement values that can either vary port to port (time delays)""" + #Return value is intended to match the power measure format: t_initial, t_final, port + t_initial = self.cycle_times[self.measure_cycles[port][power_obj.meta_str]] + t_final = self.cycle_times[self.measure_cycles[port][power_obj.meta_str]+1] + + return (t_initial, t_final, port) + + def get_volt_when_measure_variants(self, port, power_obj): + """Get the measurement values that can either vary port to port (time delays)""" + #Only checking 0 value reads for now. + t_trig = meas_cycle_delay = self.cycle_times[self.measure_cycles[port]["read0"]] + + return (t_trig, self.vdd_voltage, port) + def write_delay_measures_read_port(self, port): """ Write the measure statements to quantify the delay and power results for a read port. """ # add measure statements for delays/slews - for dname in self.delay_meas_names: - meas_values = self.get_delay_meas_values(dname, port) - self.stim.gen_meas_delay(*meas_values) + for measure in self.read_meas_objs+self.bitline_delay_objs: + measure_variant_inp_tuple = self.get_read_measure_variants(port, measure) + measure.write_measure(self.stim, measure_variant_inp_tuple) + + def get_write_measure_variants(self, port, measure_obj): + """Checks the measurement object and calls respective function for related measurement inputs.""" + meas_type = type(measure_obj) + if meas_type is power_measure: + return self.get_power_measure_variants(port, measure_obj, "write") + else: + debug.error("Input function not defined for measurement type={}".format(meas_type)) - # add measure statements for power - for pname in self.power_meas_names: - if "read" not in pname: - continue - #Different naming schemes are used for the measure cycle dict and measurement names. - #TODO: make them the same so they can be indexed the same. - if '1' in pname: - t_initial = self.cycle_times[self.measure_cycles[port]["read1"]] - t_final = self.cycle_times[self.measure_cycles[port]["read1"]+1] - elif '0' in pname: - t_initial = self.cycle_times[self.measure_cycles[port]["read0"]] - t_final = self.cycle_times[self.measure_cycles[port]["read0"]+1] - self.stim.gen_meas_power(meas_name="{0}{1}".format(pname, port), - t_initial=t_initial, - t_final=t_final) - def write_delay_measures_write_port(self, port): """ Write the measure statements to quantify the power results for a write port. """ # add measure statements for power - for pname in self.power_meas_names: - if "write" not in pname: - continue - t_initial = self.cycle_times[self.measure_cycles[port]["write0"]] - t_final = self.cycle_times[self.measure_cycles[port]["write0"]+1] - if '1' in pname: - t_initial = self.cycle_times[self.measure_cycles[port]["write1"]] - t_final = self.cycle_times[self.measure_cycles[port]["write1"]+1] - - self.stim.gen_meas_power(meas_name="{0}{1}".format(pname, port), - t_initial=t_initial, - t_final=t_final) + for measure in self.write_meas_objs: + measure_variant_inp_tuple = self.get_write_measure_variants(port, measure) + measure.write_measure(self.stim, measure_variant_inp_tuple) def write_delay_measures(self): """ @@ -385,28 +450,7 @@ class delay(simulation): previous_period = self.period debug.info(1, "Found feasible_period: {0}ns".format(self.period)) return feasible_delays - - - def parse_values(self, values_names, port, mult = 1.0): - """Parse multiple values in the timing output file. Optional multiplier. - Return a dict of the input names and values. Port used for parsing file. - """ - values = [] - all_values_floats = True - for vname in values_names: - #ngspice converts all measure characters to lowercase, not tested on other sims - value = parse_spice_list("timing", "{0}{1}".format(vname.lower(), port)) - #Check if any of the values fail to parse - if type(value)!=float: - all_values_floats = False - values.append(value) - - #Apply Multiplier only if all values are floats. Let other check functions handle this error. - if all_values_floats: - return {values_names[i]:values[i]*mult for i in range(len(values))} - else: - return {values_names[i]:values[i] for i in range(len(values))} - + def run_delay_simulation(self): """ This tries to simulate a period and checks if the result works. If @@ -427,33 +471,45 @@ class delay(simulation): #Too much duplicate code here. Try reducing for port in self.targ_read_ports: debug.info(2, "Check delay values for port {}".format(port)) - delay_names = [mname for mname in self.delay_meas_names] - delays = self.parse_values(delay_names, port, 1e9) # scale delays to ns - if not self.check_valid_delays(delays): - return (False,{}) - result[port].update(delays) + read_port_dict = {} + #Get measurements from output file + for measure in self.read_meas_objs: + read_port_dict[measure.name] = measure.retrieve_measure(port=port) + + #Check timing for read ports. Power is only checked if it was read correctly + if not self.check_valid_delays(read_port_dict): + return (False,{}) + if not check_dict_values_is_float(read_port_dict): + debug.error("Failed to Measure Read Port Values:\n\t\t{0}".format(read_port_dict),1) #Printing the entire dict looks bad. + + result[port].update(read_port_dict) + + bitline_delay_dict = self.evaluate_bitline_delay(port) + result[port].update(bitline_delay_dict) - power_names = [mname for mname in self.power_meas_names if 'read' in mname] - powers = self.parse_values(power_names, port, 1e3) # scale power to mw - #Check that power parsing worked. - for name, power in powers.items(): - if type(power)!=float: - debug.error("Failed to Parse Power Values:\n\t\t{0}".format(powers),1) #Printing the entire dict looks bad. - result[port].update(powers) - for port in self.targ_write_ports: - power_names = [mname for mname in self.power_meas_names if 'write' in mname] - powers = self.parse_values(power_names, port, 1e3) # scale power to mw - #Check that power parsing worked. - for name, power in powers.items(): - if type(power)!=float: - debug.error("Failed to Parse Power Values:\n\t\t{0}".format(powers),1) #Printing the entire dict looks bad. - result[port].update(powers) + write_port_dict = {} + for measure in self.write_meas_objs: + write_port_dict[measure.name] = measure.retrieve_measure(port=port) + + if not check_dict_values_is_float(write_port_dict): + debug.error("Failed to Measure Write Port Values:\n\t\t{0}".format(write_port_dict),1) #Printing the entire dict looks bad. + result[port].update(write_port_dict) # The delay is from the negative edge for our SRAM return (True,result) - + def evaluate_bitline_delay(self, port): + """Parse and check the bitline delay. One of the measurements is expected to fail which warrants its own function.""" + bl_delay_meas_dict = {} + values_added = 0 #For error checking + for measure in self.bitline_delay_objs: + bl_delay_val = measure.retrieve_measure(port=port) + if type(bl_delay_val) != float or 0 > bl_delay_val or bl_delay_val > self.period/2: #Only add if value is valid, do not error. + debug.error("Bitline delay measurement failed: half-period={}, {}={}".format(self.period/2, measure.name, bl_delay_val),1) + bl_delay_meas_dict[measure.name] = bl_delay_val + return bl_delay_meas_dict + def run_power_simulation(self): """ This simulates a disabled SRAM to get the leakage power when it is off. @@ -478,13 +534,13 @@ class delay(simulation): #key=raw_input("press return to continue") return (leakage_power*1e3, trim_leakage_power*1e3) - def check_valid_delays(self, delay_dict): + def check_valid_delays(self, result_dict): """ Check if the measurements are defined and if they are valid. """ #Hard coded names currently - delay_hl = delay_dict["delay_hl"] - delay_lh = delay_dict["delay_lh"] - slew_hl = delay_dict["slew_hl"] - slew_lh = delay_dict["slew_lh"] + delay_hl = result_dict["delay_hl"] + delay_lh = result_dict["delay_lh"] + slew_hl = result_dict["slew_hl"] + slew_lh = result_dict["slew_lh"] period_load_slew_str = "period {0} load {1} slew {2}".format(self.period,self.load, self.slew) # if it failed or the read was longer than a period @@ -610,9 +666,22 @@ class delay(simulation): functions in this characterizer besides analyze.""" self.probe_address = probe_address self.probe_data = probe_data - + self.bitline_column = self.get_data_bit_column_number(probe_address, probe_data) + self.wordline_row = self.get_address_row_number(probe_address) self.prepare_netlist() + def get_data_bit_column_number(self, probe_address, probe_data): + """Calculates bitline column number of data bit under test using bit position and mux size""" + if self.sram.col_addr_size>0: + col_address = int(probe_address[0:self.sram.col_addr_size],2) + else: + col_address = 0 + bl_column = int(self.sram.words_per_row*probe_data + col_address) + return bl_column + + def get_address_row_number(self, probe_address): + """Calculates wordline row number of data bit under test using address and column mux size""" + return int(probe_address[self.sram.col_addr_size:],2) def prepare_netlist(self): """ Prepare a trimmed netlist and regular netlist. """ @@ -645,6 +714,9 @@ class delay(simulation): char_sram_data = {} self.set_probe(probe_address, probe_data) + self.create_signal_names() + self.create_measurement_names() + self.create_measurement_objects() self.load=max(loads) self.slew=max(slews) @@ -828,13 +900,14 @@ class delay(simulation): """ if OPTS.num_rw_ports > 1 or OPTS.num_w_ports > 0 and OPTS.num_r_ports > 0: debug.warning("Analytical characterization results are not supported for multiport.") - + self.create_signal_names() + self.create_measurement_names() power = self.analytical_power(slews, loads) port_data = self.get_empty_measure_data_dict() for slew in slews: for load in loads: self.set_load_slew(load,slew) - bank_delay = self.sram.analytical_delay(self.vdd_voltage, self.slew,self.load) + bank_delay = self.sram.analytical_delay(self.corner, self.slew,self.load) for port in self.all_ports: for mname in self.delay_meas_names+self.power_meas_names: if "power" in mname: @@ -845,9 +918,12 @@ class delay(simulation): port_data[port][mname].append(bank_delay[port].slew/1e3) else: debug.error("Measurement name not recognized: {}".format(mname),1) - sram_data = { "min_period": 0, - "leakage_power": power.leakage} - + period_margin = 0.1 + risefall_delay = bank_delay[self.read_ports[0]].delay/1e3 + sram_data = { "min_period":risefall_delay*2*period_margin, + "leakage_power": power.leakage} + debug.info(2,"SRAM Data:\n{}".format(sram_data)) + debug.info(2,"Port Data:\n{}".format(port_data)) return (sram_data,port_data) @@ -855,7 +931,7 @@ class delay(simulation): """Get the dynamic and leakage power from the SRAM""" #slews unused, only last load is used load = loads[-1] - power = self.sram.analytical_power(self.process, self.vdd_voltage, self.temperature, load) + power = self.sram.analytical_power(self.corner, load) #convert from nW to mW power.dynamic /= 1e6 power.leakage /= 1e6 @@ -890,7 +966,7 @@ class delay(simulation): def get_empty_measure_data_dict(self): """Make a dict of lists for each type of delay and power measurement to append results to""" - measure_names = self.delay_meas_names + self.power_meas_names + measure_names = self.delay_meas_names + self.power_meas_names + self.voltage_when_names + self.bitline_delay_names #Create list of dicts. List lengths is # of ports. Each dict maps the measurement names to lists. measure_data = [{mname:[] for mname in measure_names} for i in self.all_ports] return measure_data diff --git a/compiler/characterizer/lib.py b/compiler/characterizer/lib.py index 156481ce..d24c931d 100644 --- a/compiler/characterizer/lib.py +++ b/compiler/characterizer/lib.py @@ -83,9 +83,11 @@ class lib: (self.process, self.voltage, self.temperature) = self.corner self.lib = open(lib_name, "w") debug.info(1,"Writing to {0}".format(lib_name)) + self.corner_name = lib_name.replace(self.out_dir,"").replace(".lib","") self.characterize() self.lib.close() self.parse_info(self.corner,lib_name) + def characterize(self): """ Characterize the current corner. """ @@ -325,7 +327,7 @@ class lib: self.lib.write(" }\n") - self.lib.write(" pin(DOUT{}){{\n".format(read_port)) + self.lib.write(" pin(DOUT{0}[{1}:0]){{\n".format(read_port,self.sram.word_size-1)) self.lib.write(" timing(){ \n") self.lib.write(" timing_sense : non_unate; \n") self.lib.write(" related_pin : \"clk{0}\"; \n".format(read_port)) @@ -358,7 +360,7 @@ class lib: self.lib.write(" address : ADDR{0}; \n".format(write_port)) self.lib.write(" clocked_on : clk{0}; \n".format(write_port)) self.lib.write(" }\n") - self.lib.write(" pin(DIN{}){{\n".format(write_port)) + self.lib.write(" pin(DIN{0}[{1}:0]){{\n".format(write_port,self.sram.word_size-1)) self.write_FF_setuphold(write_port) self.lib.write(" }\n") # pin self.lib.write(" }\n") #bus @@ -378,7 +380,7 @@ class lib: self.lib.write(" direction : input; \n") self.lib.write(" capacitance : {0}; \n".format(tech.spice["dff_in_cap"])) self.lib.write(" max_transition : {0};\n".format(self.slews[-1])) - self.lib.write(" pin(ADDR{})".format(port)) + self.lib.write(" pin(ADDR{0}[{1}:0])".format(port,self.sram.addr_size-1)) self.lib.write("{\n") self.write_FF_setuphold(port) @@ -481,17 +483,16 @@ class lib: self.lib.write(" }\n") def compute_delay(self): - """ Do the analysis if we haven't characterized the SRAM yet """ - if not hasattr(self,"d"): - self.d = delay(self.sram, self.sp_file, self.corner) - if self.use_model: - char_results = self.d.analytical_delay(self.slews,self.loads) - self.char_sram_results, self.char_port_results = char_results - else: - probe_address = "1" * self.sram.addr_size - probe_data = self.sram.word_size - 1 - char_results = self.d.analyze(probe_address, probe_data, self.slews, self.loads) - self.char_sram_results, self.char_port_results = char_results + """Compute SRAM delays for current corner""" + self.d = delay(self.sram, self.sp_file, self.corner) + if self.use_model: + char_results = self.d.analytical_delay(self.slews,self.loads) + self.char_sram_results, self.char_port_results = char_results + else: + probe_address = "1" * self.sram.addr_size + probe_data = self.sram.word_size - 1 + char_results = self.d.analyze(probe_address, probe_data, self.slews, self.loads) + self.char_sram_results, self.char_port_results = char_results def compute_setup_hold(self): """ Do the analysis if we haven't characterized a FF yet """ @@ -507,9 +508,11 @@ class lib: def parse_info(self,corner,lib_name): """ Copies important characterization data to datasheet.info to be added to datasheet """ if OPTS.is_unit_test: - git_id = 'AAAAAAAAAAAAAAAAAAAA' + git_id = 'FFFFFFFFFFFFFFFFFFFF' + else: with open(os.devnull, 'wb') as devnull: + # parses the mose recent git commit id - requres git is installed proc = subprocess.Popen(['git','rev-parse','HEAD'], cwd=os.path.abspath(os.environ.get("OPENRAM_HOME")) + '/', stdout=subprocess.PIPE) git_id = str(proc.stdout.read()) @@ -518,16 +521,17 @@ class lib: git_id = git_id[2:-3] except: pass - + # check if git id is valid if len(git_id) != 40: debug.warning("Failed to retrieve git id") git_id = 'Failed to retruieve' datasheet = open(OPTS.openram_temp +'/datasheet.info', 'a+') - - current_time = datetime.datetime.now() - datasheet.write("{0},{1},{2},{3},{4},{5},{6},{7},{8},{9},{10},{11},{12},{13},{14},{15},".format( - "sram_{0}_{1}_{2}".format(OPTS.word_size, OPTS.num_words, OPTS.tech_name), + + current_time = datetime.date.today() + # write static information to be parser later + datasheet.write("{0},{1},{2},{3},{4},{5},{6},{7},{8},{9},{10},{11},{12},{13},{14},{15},{16},".format( + OPTS.output_name, OPTS.num_words, OPTS.num_banks, OPTS.num_rw_ports, @@ -542,7 +546,8 @@ class lib: lib_name, OPTS.word_size, git_id, - current_time + current_time, + OPTS.analytical_delay )) # information of checks @@ -555,7 +560,9 @@ class lib: LVS = str(total_lvs_errors) datasheet.write("{0},{1},".format(DRC, LVS)) + # write area datasheet.write(str(self.sram.width * self.sram.height)+',') + # write timing information for all ports for port in self.all_ports: #DIN timings if port in self.write_ports: @@ -652,9 +659,45 @@ class lib: )) + # write power information + for port in self.all_ports: + name = '' + read_write = '' + # write dynamic power usage + if port in self.read_ports: + web_name = " & !WEb{0}".format(port) + name = "!CSb{0} & clk{0}{1}".format(port, web_name) + read_write = 'Read' + datasheet.write("{0},{1},{2},{3},".format( + "power", + name, + read_write, + + np.mean(self.char_port_results[port]["read1_power"] + self.char_port_results[port]["read0_power"])/2 + )) + + if port in self.write_ports: + web_name = " & WEb{0}".format(port) + name = "!CSb{0} & !clk{0}{1}".format(port, web_name) + read_write = 'Write' + + datasheet.write("{0},{1},{2},{3},".format( + 'power', + name, + read_write, + np.mean(self.char_port_results[port]["write1_power"] + self.char_port_results[port]["write0_power"])/2 + + )) + + # write leakage power + control_str = 'CSb0' + for i in range(1, self.total_port_num): + control_str += ' & CSb{0}'.format(i) + + datasheet.write("{0},{1},{2},".format('leak', control_str, self.char_sram_results["leakage_power"])) + datasheet.write("END\n") datasheet.close() - diff --git a/compiler/characterizer/logical_effort.py b/compiler/characterizer/logical_effort.py index bf8c1585..c80e69a2 100644 --- a/compiler/characterizer/logical_effort.py +++ b/compiler/characterizer/logical_effort.py @@ -10,7 +10,8 @@ class logical_effort(): min_inv_cin = 1+beta pinv=parameter["min_inv_para_delay"] - def __init__(self, size, cin, cout, parasitic, out_is_rise=True): + def __init__(self, name, size, cin, cout, parasitic, out_is_rise=True): + self.name = name self.cin = cin self.cout = cout self.logical_effort = (self.cin/size)/logical_effort.min_inv_cin @@ -19,8 +20,13 @@ class logical_effort(): self.is_rise = out_is_rise def __str__(self): - return "g=" + str(self.logical_effort) + ", h=" + str(self.eletrical_effort) + ", p=" + str(self.parasitic_scale)+"*pinv, rise_delay="+str(self.is_rise) - + return "Name={}, g={}, h={}, p={}*pinv, rise_delay={}".format(self.name, + self.logical_effort, + self.eletrical_effort, + self.parasitic_scale, + self.is_rise + ) + def get_stage_effort(self): return self.logical_effort*self.eletrical_effort @@ -29,6 +35,10 @@ class logical_effort(): def get_stage_delay(self, pinv): return self.get_stage_effort()+self.get_parasitic_delay(pinv) + +def calculate_delays(stage_effort_list, pinv): + """Convert stage effort objects to list of delay values""" + return [stage.get_stage_delay(pinv) for stage in stage_effort_list] def calculate_relative_delay(stage_effort_list, pinv=parameter["min_inv_para_delay"]): """Calculates the total delay of a given delay path made of a list of logical effort objects.""" @@ -40,7 +50,7 @@ def calculate_relative_rise_fall_delays(stage_effort_list, pinv=parameter["min_i debug.info(2, "Calculating rise/fall relative delays") total_rise_delay, total_fall_delay = 0,0 for stage in stage_effort_list: - debug.info(3, stage) + debug.info(2, stage) if stage.is_rise: total_rise_delay += stage.get_stage_delay(pinv) else: diff --git a/compiler/characterizer/measurements.py b/compiler/characterizer/measurements.py new file mode 100644 index 00000000..e3d16584 --- /dev/null +++ b/compiler/characterizer/measurements.py @@ -0,0 +1,159 @@ +import debug +from tech import drc, parameter, spice +from abc import ABC, abstractmethod +from .stimuli import * +from .charutils import * + +class spice_measurement(ABC): + """Base class for spice stimulus measurements.""" + def __init__(self, measure_name, measure_scale=None): + #Names must be unique for correct spice simulation, but not enforced here. + self.name = measure_name + self.measure_scale = measure_scale + #Some meta values used externally. variables are added here for consistency accross the objects + self.meta_str = None + self.meta_add_delay = False + @abstractmethod + def get_measure_function(self): + return None + + @abstractmethod + def get_measure_values(self): + return None + + def write_measure(self, stim_obj, input_tuple): + measure_func = self.get_measure_function() + if measure_func == None: + debug.error("Did not set measure function",1) + measure_vals = self.get_measure_values(*input_tuple) + measure_func(stim_obj, *measure_vals) + + def retrieve_measure(self, port=""): + value = parse_spice_list("timing", "{0}{1}".format(self.name.lower(), port)) + if type(value)!=float or self.measure_scale == None: + return value + else: + return value*self.measure_scale + +class delay_measure(spice_measurement): + """Generates a spice measurement for the delay of 50%-to-50% points of two signals.""" + + def __init__(self, measure_name, trig_name, targ_name, trig_dir_str, targ_dir_str, trig_vdd=0.5, targ_vdd=0.5, measure_scale=None): + spice_measurement.__init__(self, measure_name, measure_scale) + self.set_meas_constants(trig_name, targ_name, trig_dir_str, targ_dir_str, trig_vdd, targ_vdd) + + def get_measure_function(self): + return stimuli.gen_meas_delay + + def set_meas_constants(self, trig_name, targ_name, trig_dir_str, targ_dir_str, trig_vdd, targ_vdd): + """Set the constants for this measurement: signal names, directions, and trigger scales""" + self.trig_dir_str = trig_dir_str + self.targ_dir_str = targ_dir_str + + self.trig_val_of_vdd = trig_vdd + self.targ_val_of_vdd = targ_vdd + + self.trig_name_no_port = trig_name + self.targ_name_no_port = targ_name + + #Time delays and ports are variant and needed as inputs when writing the measurement + + def get_measure_values(self, trig_td, targ_td, vdd_voltage, port=None): + """Constructs inputs to stimulus measurement function. Variant values are inputs here.""" + trig_val = self.trig_val_of_vdd * vdd_voltage + targ_val = self.targ_val_of_vdd * vdd_voltage + + if port != None: + #For dictionary indexing reasons, the name is formatted differently than the signals + meas_name = "{}{}".format(self.name, port) + trig_name = self.trig_name_no_port.format(port) + targ_name = self.targ_name_no_port.format(port) + else: + meas_name = self.name + trig_name = self.trig_name_no_port + targ_name = self.targ_name_no_port + + return (meas_name,trig_name,targ_name,trig_val,targ_val,self.trig_dir_str,self.targ_dir_str,trig_td,targ_td) + +class slew_measure(delay_measure): + + def __init__(self, measure_name, signal_name, slew_dir_str, measure_scale=None): + spice_measurement.__init__(self, measure_name, measure_scale) + self.set_meas_constants(signal_name, slew_dir_str) + + def set_meas_constants(self, signal_name, slew_dir_str): + """Set the values needed to generate a Spice measurement statement based on the name of the measurement.""" + self.trig_dir_str = slew_dir_str + self.targ_dir_str = slew_dir_str + + if slew_dir_str == "RISE": + self.trig_val_of_vdd = 0.1 + self.targ_val_of_vdd = 0.9 + elif slew_dir_str == "FALL": + self.trig_val_of_vdd = 0.9 + self.targ_val_of_vdd = 0.1 + else: + debug.error("Unrecognised slew measurement direction={}".format(slew_dir_str),1) + + self.trig_name_no_port = signal_name + self.targ_name_no_port = signal_name + + #Time delays and ports are variant and needed as inputs when writing the measurement + +class power_measure(spice_measurement): + """Generates a spice measurement for the average power between two time points.""" + + def __init__(self, measure_name, power_type="", measure_scale=None): + spice_measurement.__init__(self, measure_name, measure_scale) + self.set_meas_constants(power_type) + + def get_measure_function(self): + return stimuli.gen_meas_power + + def set_meas_constants(self, power_type): + """Sets values useful for power simulations. This value is only meta related to the lib file (rise/fall)""" + #Not needed for power simulation + self.power_type = power_type #Expected to be "RISE"/"FALL" + + def get_measure_values(self, t_initial, t_final, port=None): + """Constructs inputs to stimulus measurement function. Variant values are inputs here.""" + if port != None: + meas_name = "{}{}".format(self.name, port) + else: + meas_name = self.name + return (meas_name,t_initial,t_final) + +class voltage_when_measure(spice_measurement): + """Generates a spice measurement to measure the voltage of a signal based on the voltage of another.""" + + def __init__(self, measure_name, trig_name, targ_name, trig_dir_str, trig_vdd, measure_scale=None): + spice_measurement.__init__(self, measure_name, measure_scale) + self.set_meas_constants(trig_name, targ_name, trig_dir_str, trig_vdd) + + def get_measure_function(self): + return stimuli.gen_meas_find_voltage + + def set_meas_constants(self, trig_name, targ_name, trig_dir_str, trig_vdd): + """Sets values useful for power simulations. This value is only meta related to the lib file (rise/fall)""" + self.trig_dir_str = trig_dir_str + self.trig_val_of_vdd = trig_vdd + + self.trig_name_no_port = trig_name + self.targ_name_no_port = targ_name + + def get_measure_values(self, trig_td, vdd_voltage, port=None): + """Constructs inputs to stimulus measurement function. Variant values are inputs here.""" + + if port != None: + #For dictionary indexing reasons, the name is formatted differently than the signals + meas_name = "{}{}".format(self.name, port) + trig_name = self.trig_name_no_port.format(port) + targ_name = self.targ_name_no_port.format(port) + else: + meas_name = self.name + trig_name = self.trig_name_no_port + targ_name = self.targ_name_no_port + + trig_voltage = self.trig_val_of_vdd*vdd_voltage + + return (meas_name,trig_name,targ_name,trig_voltage,self.trig_dir_str,trig_td) \ No newline at end of file diff --git a/compiler/characterizer/model_check.py b/compiler/characterizer/model_check.py new file mode 100644 index 00000000..12bc5d58 --- /dev/null +++ b/compiler/characterizer/model_check.py @@ -0,0 +1,348 @@ +import sys,re,shutil +import debug +import tech +import math +from .stimuli import * +from .trim_spice import * +from .charutils import * +import utils +from globals import OPTS +from .delay import delay +from .measurements import * + +class model_check(delay): + """Functions to test for the worst case delay in a target SRAM + + The current worst case determines a feasible period for the SRAM then tests + several bits and record the delay and differences between the bits. + + """ + + def __init__(self, sram, spfile, corner): + delay.__init__(self,sram,spfile,corner) + self.period = tech.spice["feasible_period"] + self.create_data_names() + + def create_data_names(self): + self.wl_meas_name, self.wl_model_name = "wl_measures", "wl_model" + self.sae_meas_name, self.sae_model_name = "sae_measures", "sae_model" + self.wl_slew_name, self.sae_slew_name = "wl_slews", "sae_slews" + + def create_measurement_names(self): + """Create measurement names. The names themselves currently define the type of measurement""" + #Create delay measurement names + wl_en_driver_delay_names = ["delay_wl_en_dvr_{}".format(stage) for stage in range(1,self.get_num_wl_en_driver_stages())] + wl_driver_delay_names = ["delay_wl_dvr_{}".format(stage) for stage in range(1,self.get_num_wl_driver_stages())] + sen_driver_delay_names = ["delay_sen_dvr_{}".format(stage) for stage in range(1,self.get_num_sen_driver_stages())] + dc_delay_names = ["delay_delay_chain_stage_{}".format(stage) for stage in range(1,self.get_num_delay_stages()+1)] + self.wl_delay_meas_names = wl_en_driver_delay_names+["delay_wl_en", "delay_wl_bar"]+wl_driver_delay_names+["delay_wl"] + self.rbl_delay_meas_names = ["delay_gated_clk_nand", "delay_delay_chain_in"]+dc_delay_names + self.sae_delay_meas_names = ["delay_pre_sen"]+sen_driver_delay_names+["delay_sen"] + + self.delay_chain_indices = (len(self.rbl_delay_meas_names)-len(dc_delay_names), len(self.rbl_delay_meas_names)) + #Create slew measurement names + wl_en_driver_slew_names = ["slew_wl_en_dvr_{}".format(stage) for stage in range(1,self.get_num_wl_en_driver_stages())] + wl_driver_slew_names = ["slew_wl_dvr_{}".format(stage) for stage in range(1,self.get_num_wl_driver_stages())] + sen_driver_slew_names = ["slew_sen_dvr_{}".format(stage) for stage in range(1,self.get_num_sen_driver_stages())] + dc_slew_names = ["slew_delay_chain_stage_{}".format(stage) for stage in range(1,self.get_num_delay_stages()+1)] + self.wl_slew_meas_names = ["slew_wl_gated_clk_bar"]+wl_en_driver_slew_names+["slew_wl_en", "slew_wl_bar"]+wl_driver_slew_names+["slew_wl"] + self.rbl_slew_meas_names = ["slew_rbl_gated_clk_bar","slew_gated_clk_nand", "slew_delay_chain_in"]+dc_slew_names + self.sae_slew_meas_names = ["slew_replica_bl0", "slew_pre_sen"]+sen_driver_slew_names+["slew_sen"] + + def create_signal_names(self): + """Creates list of the signal names used in the spice file along the wl and sen paths. + Names are re-harded coded here; i.e. the names are hardcoded in most of OpenRAM and are + replicated here. + """ + delay.create_signal_names(self) + #Signal names are all hardcoded, need to update to make it work for probe address and different configurations. + wl_en_driver_signals = ["Xsram.Xcontrol0.Xbuf_wl_en.Zb{}_int".format(stage) for stage in range(1,self.get_num_wl_en_driver_stages())] + wl_driver_signals = ["Xsram.Xbank0.Xwordline_driver0.Xwl_driver_inv{}.Zb{}_int".format(self.wordline_row, stage) for stage in range(1,self.get_num_wl_driver_stages())] + sen_driver_signals = ["Xsram.Xcontrol0.Xbuf_s_en.Zb{}_int".format(stage) for stage in range(1,self.get_num_sen_driver_stages())] + delay_chain_signal_names = ["Xsram.Xcontrol0.Xreplica_bitline.Xdelay_chain.dout_{}".format(stage) for stage in range(1,self.get_num_delay_stages())] + + self.wl_signal_names = ["Xsram.Xcontrol0.gated_clk_bar"]+\ + wl_en_driver_signals+\ + ["Xsram.wl_en0", "Xsram.Xbank0.Xwordline_driver0.wl_bar_{}".format(self.wordline_row)]+\ + wl_driver_signals+\ + ["Xsram.Xbank0.wl_{}".format(self.wordline_row)] + pre_delay_chain_names = ["Xsram.Xcontrol0.gated_clk_bar", "Xsram.Xcontrol0.Xand2_rbl_in.zb_int", "Xsram.Xcontrol0.rbl_in"] + self.rbl_en_signal_names = pre_delay_chain_names+\ + delay_chain_signal_names+\ + ["Xsram.Xcontrol0.Xreplica_bitline.delayed_en"] + self.sae_signal_names = ["Xsram.Xcontrol0.Xreplica_bitline.bl0_0", "Xsram.Xcontrol0.pre_s_en"]+\ + sen_driver_signals+\ + ["Xsram.s_en0"] + + def create_measurement_objects(self): + """Create the measurements used for read and write ports""" + self.create_wordline_measurement_objects() + self.create_sae_measurement_objects() + self.all_measures = self.wl_meas_objs+self.sae_meas_objs + + def create_wordline_measurement_objects(self): + """Create the measurements to measure the wordline path from the gated_clk_bar signal""" + self.wl_meas_objs = [] + trig_dir = "RISE" + targ_dir = "FALL" + + for i in range(1, len(self.wl_signal_names)): + self.wl_meas_objs.append(delay_measure(self.wl_delay_meas_names[i-1], + self.wl_signal_names[i-1], + self.wl_signal_names[i], + trig_dir, + targ_dir, + measure_scale=1e9)) + self.wl_meas_objs.append(slew_measure(self.wl_slew_meas_names[i-1], + self.wl_signal_names[i-1], + trig_dir, + measure_scale=1e9)) + temp_dir = trig_dir + trig_dir = targ_dir + targ_dir = temp_dir + self.wl_meas_objs.append(slew_measure(self.wl_slew_meas_names[-1], self.wl_signal_names[-1], trig_dir, measure_scale=1e9)) + + def create_sae_measurement_objects(self): + """Create the measurements to measure the sense amp enable path from the gated_clk_bar signal. The RBL splits this path into two.""" + + self.sae_meas_objs = [] + trig_dir = "RISE" + targ_dir = "FALL" + #Add measurements from gated_clk_bar to RBL + for i in range(1, len(self.rbl_en_signal_names)): + self.sae_meas_objs.append(delay_measure(self.rbl_delay_meas_names[i-1], + self.rbl_en_signal_names[i-1], + self.rbl_en_signal_names[i], + trig_dir, + targ_dir, + measure_scale=1e9)) + self.sae_meas_objs.append(slew_measure(self.rbl_slew_meas_names[i-1], + self.rbl_en_signal_names[i-1], + trig_dir, + measure_scale=1e9)) + temp_dir = trig_dir + trig_dir = targ_dir + targ_dir = temp_dir + self.sae_meas_objs.append(slew_measure(self.rbl_slew_meas_names[-1], + self.rbl_en_signal_names[-1], + trig_dir, + measure_scale=1e9)) + + #Add measurements from rbl_out to sae. Trigger directions do not invert from previous stage due to RBL. + trig_dir = "FALL" + targ_dir = "RISE" + #Add measurements from gated_clk_bar to RBL + for i in range(1, len(self.sae_signal_names)): + self.sae_meas_objs.append(delay_measure(self.sae_delay_meas_names[i-1], + self.sae_signal_names[i-1], + self.sae_signal_names[i], + trig_dir, + targ_dir, + measure_scale=1e9)) + self.sae_meas_objs.append(slew_measure(self.sae_slew_meas_names[i-1], + self.sae_signal_names[i-1], + trig_dir, + measure_scale=1e9)) + temp_dir = trig_dir + trig_dir = targ_dir + targ_dir = temp_dir + self.sae_meas_objs.append(slew_measure(self.sae_slew_meas_names[-1], + self.sae_signal_names[-1], + trig_dir, + measure_scale=1e9)) + + def write_delay_measures(self): + """ + Write the measure statements to quantify the delay and power results for all targeted ports. + """ + self.sf.write("\n* Measure statements for delay and power\n") + + # Output some comments to aid where cycles start and what is happening + for comment in self.cycle_comments: + self.sf.write("* {}\n".format(comment)) + + for read_port in self.targ_read_ports: + self.write_measures_read_port(read_port) + + def get_delay_measure_variants(self, port, measure_obj): + """Get the measurement values that can either vary from simulation to simulation (vdd, address) + or port to port (time delays)""" + #Return value is intended to match the delay measure format: trig_td, targ_td, vdd, port + #Assuming only read 0 for now + if not (type(measure_obj) is delay_measure or type(measure_obj) is slew_measure): + debug.error("Measurement not recognized by the model checker.",1) + meas_cycle_delay = self.cycle_times[self.measure_cycles[port]["read0"]] + self.period/2 + return (meas_cycle_delay, meas_cycle_delay, self.vdd_voltage, port) + + def write_measures_read_port(self, port): + """ + Write the measure statements for all nodes along the wordline path. + """ + # add measure statements for delays/slews + for measure in self.all_measures: + measure_variant_inp_tuple = self.get_delay_measure_variants(port, measure) + measure.write_measure(self.stim, measure_variant_inp_tuple) + + def get_measurement_values(self, meas_objs, port): + """Gets the delays and slews from a specified port from the spice output file and returns them as lists.""" + delay_meas_list = [] + slew_meas_list = [] + for measure in meas_objs: + measure_value = measure.retrieve_measure(port=port) + if type(measure_value) != float: + debug.error("Failed to Measure Value:\n\t\t{}={}".format(measure.name, measure_value),1) + if type(measure) is delay_measure: + delay_meas_list.append(measure_value) + elif type(measure)is slew_measure: + slew_meas_list.append(measure_value) + else: + debug.error("Measurement object not recognized.",1) + return delay_meas_list, slew_meas_list + + def run_delay_simulation(self): + """ + This tries to simulate a period and checks if the result works. If + so, it returns True and the delays, slews, and powers. It + works on the trimmed netlist by default, so powers do not + include leakage of all cells. + """ + #Sanity Check + debug.check(self.period > 0, "Target simulation period non-positive") + + wl_delay_result = [[] for i in self.all_ports] + wl_slew_result = [[] for i in self.all_ports] + sae_delay_result = [[] for i in self.all_ports] + sae_slew_result = [[] for i in self.all_ports] + # Checking from not data_value to data_value + self.write_delay_stimulus() + + self.stim.run_sim() #running sim prodoces spice output file. + + #Retrieve the results from the output file + for port in self.targ_read_ports: + #Parse and check the voltage measurements + wl_delay_result[port], wl_slew_result[port] = self.get_measurement_values(self.wl_meas_objs, port) + sae_delay_result[port], sae_slew_result[port] = self.get_measurement_values(self.sae_meas_objs, port) + return (True,wl_delay_result, sae_delay_result, wl_slew_result, sae_slew_result) + + def get_model_delays(self, port): + """Get model delays based on port. Currently assumes single RW port.""" + return self.sram.control_logic_rw.get_wl_sen_delays() + + def get_num_delay_stages(self): + """Gets the number of stages in the delay chain from the control logic""" + return len(self.sram.control_logic_rw.replica_bitline.delay_fanout_list) + + def get_num_delay_fanout_list(self): + """Gets the number of stages in the delay chain from the control logic""" + return self.sram.control_logic_rw.replica_bitline.delay_fanout_list + + def get_num_delay_stage_fanout(self): + """Gets fanout in each stage in the delay chain. Assumes each stage is the same""" + return self.sram.control_logic_rw.replica_bitline.delay_fanout_list[0] + + def get_num_wl_en_driver_stages(self): + """Gets the number of stages in the wl_en driver from the control logic""" + return self.sram.control_logic_rw.wl_en_driver.num_stages + + def get_num_sen_driver_stages(self): + """Gets the number of stages in the sen driver from the control logic""" + return self.sram.control_logic_rw.s_en_driver.num_stages + + def get_num_wl_driver_stages(self): + """Gets the number of stages in the wordline driver from the control logic""" + return self.sram.bank.wordline_driver.inv.num_stages + + def scale_delays(self, delay_list): + """Takes in a list of measured delays and convert it to simple units to easily compare to model values.""" + converted_values = [] + #Calculate average + total = 0 + for meas_value in delay_list: + total+=meas_value + average = total/len(delay_list) + + #Convert values + for meas_value in delay_list: + converted_values.append(meas_value/average) + return converted_values + + def min_max_normalization(self, value_list): + """Re-scales input values on a range from 0-1 where min(list)=0, max(list)=1""" + scaled_values = [] + min_max_diff = max(value_list) - min(value_list) + average = sum(value_list)/len(value_list) + for value in value_list: + scaled_values.append((value-average)/(min_max_diff)) + return scaled_values + + def calculate_error_l2_norm(self, list_a, list_b): + """Calculates error between two lists using the l2 norm""" + error_list = [] + for val_a, val_b in zip(list_a, list_b): + error_list.append((val_a-val_b)**2) + return error_list + + def compare_measured_and_model(self, measured_vals, model_vals): + """First scales both inputs into similar ranges and then compares the error between both.""" + scaled_meas = self.min_max_normalization(measured_vals) + debug.info(1, "Scaled measurements:\n{}".format(scaled_meas)) + scaled_model = self.min_max_normalization(model_vals) + debug.info(1, "Scaled model:\n{}".format(scaled_model)) + errors = self.calculate_error_l2_norm(scaled_meas, scaled_model) + debug.info(1, "Errors:\n{}\n".format(errors)) + + def analyze(self, probe_address, probe_data, slews, loads): + """Measures entire delay path along the wordline and sense amp enable and compare it to the model delays.""" + self.load=max(loads) + self.slew=max(slews) + self.set_probe(probe_address, probe_data) + self.create_signal_names() + self.create_measurement_names() + self.create_measurement_objects() + data_dict = {} + + read_port = self.read_ports[0] #only test the first read port + self.targ_read_ports = [read_port] + self.targ_write_ports = [self.write_ports[0]] + debug.info(1,"Model test: corner {}".format(self.corner)) + (success, wl_delays, sae_delays, wl_slews, sae_slews)=self.run_delay_simulation() + debug.check(success, "Model measurements Failed: period={}".format(self.period)) + wl_model_delays, sae_model_delays = self.get_model_delays(read_port) + + debug.info(1,"Measured Wordline delays (ns):\n\t {}".format(wl_delays[read_port])) + debug.info(1,"Wordline model delays:\n\t {}".format(wl_model_delays)) + debug.info(1,"Measured Wordline slews:\n\t {}".format(wl_slews[read_port])) + debug.info(1,"Measured SAE delays (ns):\n\t {}".format(sae_delays[read_port])) + debug.info(1,"SAE model delays:\n\t {}".format(sae_model_delays)) + debug.info(1,"Measured SAE slews:\n\t {}".format(sae_slews[read_port])) + + data_dict[self.wl_meas_name] = wl_delays[read_port] + data_dict[self.wl_model_name] = wl_model_delays + data_dict[self.sae_meas_name] = sae_delays[read_port] + data_dict[self.sae_model_name] = sae_model_delays + data_dict[self.wl_slew_name] = wl_slews[read_port] + data_dict[self.sae_slew_name] = sae_slews[read_port] + + #Some evaluations of the model and measured values + # debug.info(1, "Comparing wordline measurements and model.") + # self.compare_measured_and_model(wl_delays[read_port], wl_model_delays) + # debug.info(1, "Comparing SAE measurements and model") + # self.compare_measured_and_model(sae_delays[read_port], sae_model_delays) + + return data_dict + + def get_all_signal_names(self): + """Returns all signals names as a dict indexed by hardcoded names. Useful for writing the head of the CSV.""" + name_dict = {} + #Signal names are more descriptive than the measurement names, first value trimmed to match size of measurements names. + name_dict[self.wl_meas_name] = self.wl_signal_names[1:] + name_dict[self.wl_model_name] = name_dict["wl_measures"] #model uses same names as measured. + name_dict[self.sae_meas_name] = self.rbl_en_signal_names[1:]+self.sae_signal_names[1:] + name_dict[self.sae_model_name] = name_dict["sae_measures"] + name_dict[self.wl_slew_name] = self.wl_slew_meas_names + name_dict[self.sae_slew_name] = self.rbl_slew_meas_names+self.sae_slew_meas_names + return name_dict + + + \ No newline at end of file diff --git a/compiler/characterizer/stimuli.py b/compiler/characterizer/stimuli.py index 8c6b059f..3b569b2a 100644 --- a/compiler/characterizer/stimuli.py +++ b/compiler/characterizer/stimuli.py @@ -258,14 +258,15 @@ class stimuli(): # UIC is needed for ngspice to converge self.sf.write(".TRAN {0}p {1}n UIC\n".format(timestep,end_time)) + self.sf.write(".TEMP {}\n".format(self.temperature)) if OPTS.spice_name == "ngspice": # ngspice sometimes has convergence problems if not using gear method # which is more accurate, but slower than the default trapezoid method # Do not remove this or it may not converge due to some "pa_00" nodes # unless you figure out what these are. - self.sf.write(".OPTIONS POST=1 RELTOL={0} PROBE method=gear TEMP={1}\n".format(reltol,self.temperature)) + self.sf.write(".OPTIONS POST=1 RELTOL={0} PROBE method=gear\n".format(reltol)) else: - self.sf.write(".OPTIONS POST=1 RUNLVL={0} PROBE TEMP={1}\n".format(runlvl,self.temperature)) + self.sf.write(".OPTIONS POST=1 RUNLVL={0} PROBE\n".format(runlvl)) # create plots for all signals self.sf.write("* probe is used for hspice/xa, while plot is used in ngspice\n") diff --git a/compiler/datasheet/assets/OpenRAM_logo.png b/compiler/datasheet/assets/OpenRAM_logo.png new file mode 100644 index 00000000..d155cce0 Binary files /dev/null and b/compiler/datasheet/assets/OpenRAM_logo.png differ diff --git a/compiler/datasheet/assets/datasheet.css b/compiler/datasheet/assets/datasheet.css index ff16f101..629239bd 100644 --- a/compiler/datasheet/assets/datasheet.css +++ b/compiler/datasheet/assets/datasheet.css @@ -19,8 +19,8 @@ padding-top: 11px; padding-bottom: 11px; text-align: left; - background-color: #004184; - color: #F1B521; + background-color: #003C6C; + color: #FDC700; } diff --git a/compiler/datasheet/assets/openram_logo_placeholder.png b/compiler/datasheet/assets/openram_logo_placeholder.png deleted file mode 100644 index b19f0bfe..00000000 Binary files a/compiler/datasheet/assets/openram_logo_placeholder.png and /dev/null differ diff --git a/compiler/datasheet/assets/vlsi_logo.png b/compiler/datasheet/assets/vlsi_logo.png index 3f02a45e..784277af 100644 Binary files a/compiler/datasheet/assets/vlsi_logo.png and b/compiler/datasheet/assets/vlsi_logo.png differ diff --git a/compiler/datasheet/datasheet.py b/compiler/datasheet/datasheet.py index d15733d5..a7700349 100644 --- a/compiler/datasheet/datasheet.py +++ b/compiler/datasheet/datasheet.py @@ -28,17 +28,17 @@ class datasheet(): # for item in self.description: # self.html += item + ',' self.html += '-->' - + # Add vlsida logo vlsi_logo = 0 with open(os.path.abspath(os.environ.get("OPENRAM_HOME")) + '/datasheet/assets/vlsi_logo.png', "rb") as image_file: vlsi_logo = base64.b64encode(image_file.read()) + # Add openram logo openram_logo = 0 - with open(os.path.abspath(os.environ.get("OPENRAM_HOME")) + '/datasheet/assets/openram_logo_placeholder.png', "rb") as image_file: + with open(os.path.abspath(os.environ.get("OPENRAM_HOME")) + '/datasheet/assets/OpenRAM_logo.png', "rb") as image_file: openram_logo = base64.b64encode(image_file.read()) - self.html += 'VLSIDA'.format(str(vlsi_logo)[ - 2:-1]) + self.html += 'VLSIDAOpenRAM'.format(str(vlsi_logo)[2:-1], str(openram_logo)[2:-1]) self.html += '

' + \ self.name + '.html' + '

' @@ -49,23 +49,30 @@ class datasheet(): 'LVS errors: ' + str(self.LVS) + '

' self.html += '

' + \ 'Git commit id: ' + str(self.git_id) + '

' - + # print port table self.html += '

Ports and Configuration

' -# self.html += in_out(self.io,table_id='data').__html__().replace('<','<').replace('"','"').replace('>',">") self.html += self.io_table.to_html() + # print operating condidition information self.html += '

Operating Conditions

' -# self.html += operating_conditions(self.operating,table_id='data').__html__() self.html += self.operating_table.to_html() - self.html += '

Timing and Current Data

' -# self.html += timing_and_current_data(self.timing,table_id='data').__html__() + # check if analytical model is being used + self.html += '

Timing Data

' + model = '' + if self.ANALYTICAL_MODEL == 'True': + model = "analytical model: results may not be precise" + else: + model = "spice characterizer" + # display timing data + self.html += '

Using '+model+'

' self.html += self.timing_table.to_html() - + # display power data + self.html += '

Power Data

' + self.html += self.power_table.to_html() + # display corner information self.html += '

Characterization Corners

' -# self.html += characterization_corners(self.corners,table_id='data').__html__() self.html += self.corners_table.to_html() - + # display deliverables table self.html += '

Deliverables

' -# self.html += deliverables(self.dlv,table_id='data').__html__().replace('<','<').replace('"','"').replace('>',">") self.html += self.dlv_table.to_html() diff --git a/compiler/datasheet/datasheet_gen.py b/compiler/datasheet/datasheet_gen.py index 6786c7bf..3b4fe2ac 100644 --- a/compiler/datasheet/datasheet_gen.py +++ b/compiler/datasheet/datasheet_gen.py @@ -4,7 +4,6 @@ This is a script to load data from the characterization and layout processes int a web friendly html datasheet. """ # TODO: -# include power # Diagram generation # Improve css @@ -16,19 +15,34 @@ import csv import datasheet import table_gen - -def process_name(corner): - """ - Expands the names of the characterization corner types into something human friendly - """ - if corner == "TT": - return "Typical - Typical" - if corner == "SS": - return "Slow - Slow" - if corner == "FF": - return "Fast - Fast" - else: - return "custom" +# def process_name(corner): +# """ +# Expands the names of the characterization corner types into something human friendly +# """ +# if corner == "TS": +# return "Typical - Slow" +# if corner == "TT": +# return "Typical - Typical" +# if corner == "TF": +# return "Typical - Fast" +# +# if corner == "SS": +# return "Slow - Slow" +# if corner == "ST": +# return "Slow - Typical" +# if corner == "SF": +# return "Slow - Fast" +# +# if corner == "FS": +# return "Fast - Slow" +# if corner == "FT": +# return "Fast - Typical" +# if corner == "FF": +# return "Fast - Fast" +# +# else: +# return "custom" +# def parse_characterizer_csv(f, pages): @@ -91,15 +105,19 @@ def parse_characterizer_csv(f, pages): DATETIME = row[col] col += 1 + + ANALYTICAL_MODEL = row[col] + col += 1 DRC = row[col] col += 1 LVS = row[col] col += 1 - + AREA = row[col] col += 1 + for sheet in pages: if sheet.name == NAME: @@ -133,7 +151,7 @@ def parse_characterizer_csv(f, pages): 1000/float(MIN_PERIOD))) except Exception: pass - + # check current .lib file produces the slowest timing results while(True): col_start = col if(row[col].startswith('DIN')): @@ -147,31 +165,31 @@ def parse_characterizer_csv(f, pages): if float(row[col+2]) > float(item[2]): item[2] = row[col+2] - col += 2 + col += 2 - elif item[0].endswith('setup falling'): + if item[0].endswith('setup falling'): if float(row[col+1]) < float(item[1]): item[1] = row[col+1] if float(row[col+2]) > float(item[2]): item[2] = row[col+2] - col += 2 + col += 2 - elif item[0].endswith('hold rising'): + if item[0].endswith('hold rising'): if float(row[col+1]) < float(item[1]): item[1] = row[col+1] if float(row[col+2]) > float(item[2]): item[2] = row[col+2] - col += 2 + col += 2 - elif item[0].endswith('hold falling'): + if item[0].endswith('hold falling'): if float(row[col+1]) < float(item[1]): item[1] = row[col+1] if float(row[col+2]) > float(item[2]): item[2] = row[col+2] - col += 2 + col += 2 col += 1 @@ -186,31 +204,31 @@ def parse_characterizer_csv(f, pages): if float(row[col+2]) > float(item[2]): item[2] = row[col+2] - col += 2 + col += 2 - elif item[0].endswith('cell fall'): + if item[0].endswith('cell fall'): if float(row[col+1]) < float(item[1]): item[1] = row[col+1] if float(row[col+2]) > float(item[2]): item[2] = row[col+2] - col += 2 + col += 2 - elif item[0].endswith('rise transition'): + if item[0].endswith('rise transition'): if float(row[col+1]) < float(item[1]): item[1] = row[col+1] if float(row[col+2]) > float(item[2]): item[2] = row[col+2] - col += 2 + col += 2 - elif item[0].endswith('fall transition'): + if item[0].endswith('fall transition'): if float(row[col+1]) < float(item[1]): item[1] = row[col+1] if float(row[col+2]) > float(item[2]): item[2] = row[col+2] - col += 2 + col += 2 col += 1 @@ -225,31 +243,31 @@ def parse_characterizer_csv(f, pages): if float(row[col+2]) > float(item[2]): item[2] = row[col+2] - col += 2 + col += 2 - elif item[0].endswith('setup falling'): + if item[0].endswith('setup falling'): if float(row[col+1]) < float(item[1]): item[1] = row[col+1] if float(row[col+2]) > float(item[2]): item[2] = row[col+2] - col += 2 + col += 2 - elif item[0].endswith('hold rising'): + if item[0].endswith('hold rising'): if float(row[col+1]) < float(item[1]): item[1] = row[col+1] if float(row[col+2]) > float(item[2]): item[2] = row[col+2] - col += 2 + col += 2 - elif item[0].endswith('hold falling'): + if item[0].endswith('hold falling'): if float(row[col+1]) < float(item[1]): item[1] = row[col+1] if float(row[col+2]) > float(item[2]): item[2] = row[col+2] - col += 2 + col += 2 col += 1 @@ -264,31 +282,31 @@ def parse_characterizer_csv(f, pages): if float(row[col+2]) > float(item[2]): item[2] = row[col+2] - col += 2 + col += 2 - elif item[0].endswith('setup falling'): + if item[0].endswith('setup falling'): if float(row[col+1]) < float(item[1]): item[1] = row[col+1] if float(row[col+2]) > float(item[2]): item[2] = row[col+2] - col += 2 + col += 2 - elif item[0].endswith('hold rising'): + if item[0].endswith('hold rising'): if float(row[col+1]) < float(item[1]): item[1] = row[col+1] if float(row[col+2]) > float(item[2]): item[2] = row[col+2] - col += 2 + col += 2 - elif item[0].endswith('hold falling'): + if item[0].endswith('hold falling'): if float(row[col+1]) < float(item[1]): item[1] = row[col+1] if float(row[col+2]) > float(item[2]): item[2] = row[col+2] - col += 2 + col += 2 col += 1 @@ -303,31 +321,31 @@ def parse_characterizer_csv(f, pages): if float(row[col+2]) > float(item[2]): item[2] = row[col+2] - col += 2 + col += 2 - elif item[0].endswith('setup falling'): + if item[0].endswith('setup falling'): if float(row[col+1]) < float(item[1]): item[1] = row[col+1] if float(row[col+2]) > float(item[2]): item[2] = row[col+2] - col += 2 + col += 2 - elif item[0].endswith('hold rising'): + if item[0].endswith('hold rising'): if float(row[col+1]) < float(item[1]): item[1] = row[col+1] if float(row[col+2]) > float(item[2]): item[2] = row[col+2] - col += 2 + col += 2 - elif item[0].endswith('hold falling'): + if item[0].endswith('hold falling'): if float(row[col+1]) < float(item[1]): item[1] = row[col+1] if float(row[col+2]) > float(item[2]): item[2] = row[col+2] - col += 2 + col += 2 col += 1 @@ -336,8 +354,36 @@ def parse_characterizer_csv(f, pages): sheet.description.append(str(element)) break - new_sheet.corners_table.add_row([PROC, process_name( - PROC), VOLT, TEMP, LIB_NAME.replace(OUT_DIR, '').replace(NAME, '')]) + #check if new power is worse the previous + while(True): + col_start = col + if row[col] == 'power': + for item in sheet.power_table.rows: + if item[0].startswith(row[col+1]): + if item[2].startswith('{0} Rising'.format(row[col+2])): + if float(item[2]) < float(row[col+3]): + item[2] = row[col+3] + if item[2].startswith('{0} Falling'.format(row[col+2])): + if float(item[2]) < float(row[col+3]): + item[2] = row[col+3] + col += 4 + else: + break + # check if new leakge is worse the previous + while(True): + col_start = col + if row[col] == 'leak': + for item in sheet.power_table.rows: + if item[0].startswith(row[col+1]): + if float(item[2]) < float(row[col+2]): + item[2] = row[col+2] + col += 3 + + else: + break + # add new corner information + new_sheet.corners_table.add_row( + [PROC, VOLT, TEMP, LIB_NAME.replace(OUT_DIR, '').replace(NAME, '')]) new_sheet.dlv_table.add_row( ['.lib', 'Synthesis models', '{1}'.format(LIB_NAME, LIB_NAME.replace(OUT_DIR, ''))]) @@ -351,14 +397,15 @@ def parse_characterizer_csv(f, pages): new_sheet.time = DATETIME new_sheet.DRC = DRC new_sheet.LVS = LVS + new_sheet.ANALYTICAL_MODEL = ANALYTICAL_MODEL new_sheet.description = [NAME, NUM_WORDS, NUM_BANKS, NUM_RW_PORTS, NUM_W_PORTS, NUM_R_PORTS, TECH_NAME, MIN_PERIOD, WORD_SIZE, ORIGIN_ID, DATETIME] new_sheet.corners_table = table_gen.table_gen("corners") new_sheet.corners_table.add_row( - ['Corner Name', 'Process', 'Power Supply', 'Temperature', 'Library Name Suffix']) - new_sheet.corners_table.add_row([PROC, process_name( - PROC), VOLT, TEMP, LIB_NAME.replace(OUT_DIR, '').replace(NAME, '')]) + ['Transistor Type', 'Power Supply', 'Temperature', 'Corner Name']) + new_sheet.corners_table.add_row( + [PROC, VOLT, TEMP, LIB_NAME.replace(OUT_DIR, '').replace(NAME, '')]) new_sheet.operating_table = table_gen.table_gen( "operating_table") new_sheet.operating_table.add_row( @@ -375,9 +422,13 @@ def parse_characterizer_csv(f, pages): # failed to provide non-zero MIN_PERIOD new_sheet.operating_table.add_row( ['Operating Frequency (F)', '', '', "not available in netlist only", 'MHz']) + new_sheet.power_table = table_gen.table_gen("power") + new_sheet.power_table.add_row( + ['Pins', 'Mode', 'Power', 'Units']) new_sheet.timing_table = table_gen.table_gen("timing") new_sheet.timing_table.add_row( ['Parameter', 'Min', 'Max', 'Units']) + # parse initial timing information while(True): col_start = col if(row[col].startswith('DIN')): @@ -504,6 +555,32 @@ def parse_characterizer_csv(f, pages): for element in row[col_start:col-1]: sheet.description.append(str(element)) break + # parse initial power and leakage information + while(True): + start = col + if(row[col].startswith('power')): + new_sheet.power_table.add_row([row[col+1], + '{0} Rising'.format( + row[col+2]), + row[col+3][0:6], + 'mW'] + ) + new_sheet.power_table.add_row([row[col+1], + '{0} Falling'.format( + row[col+2]), + row[col+3][0:6], + 'mW'] + ) + + col += 4 + + elif(row[col].startswith('leak')): + new_sheet.power_table.add_row( + [row[col+1], 'leakage', row[col+2], 'mW']) + col += 3 + + else: + break new_sheet.dlv_table = table_gen.table_gen("dlv") new_sheet.dlv_table.add_row(['Type', 'Description', 'Link']) @@ -537,12 +614,13 @@ def parse_characterizer_csv(f, pages): new_sheet.io_table.add_row(['NUM_RW_PORTS', NUM_RW_PORTS]) new_sheet.io_table.add_row(['NUM_R_PORTS', NUM_R_PORTS]) new_sheet.io_table.add_row(['NUM_W_PORTS', NUM_W_PORTS]) - new_sheet.io_table.add_row(['Area', AREA]) + new_sheet.io_table.add_row( + ['Area (µm2)', str(round(float(AREA)))]) class datasheet_gen(): def datasheet_write(name): - + """writes the datasheet to a file""" in_dir = OPTS.openram_temp if not (os.path.isdir(in_dir)): diff --git a/compiler/datasheet/table_gen.py b/compiler/datasheet/table_gen.py index 18590739..8f94e896 100644 --- a/compiler/datasheet/table_gen.py +++ b/compiler/datasheet/table_gen.py @@ -1,24 +1,29 @@ class table_gen: - def __init__(self,name): + """small library of functions to generate the html tables""" + + def __init__(self, name): self.name = name self.rows = [] self.table_id = 'data' - def add_row(self,row): + def add_row(self, row): + """add a row to table_gen object""" self.rows.append(row) def gen_table_head(self): + """generate html table header""" html = '' html += '' html += '' for col in self.rows[0]: - html += '' + str(col) + '' + html += '' + str(col) + '' html += '' html += '' return html def gen_table_body(self): + """generate html body (used after gen_table_head)""" html = '' html += '' @@ -31,13 +36,13 @@ class table_gen: html += '' html += '' return html - + def to_html(self): - + """writes table_gen object to inline html""" html = '' html += '' html += self.gen_table_head() html += self.gen_table_body() html += '
' - + return html diff --git a/compiler/datasheet/wavedrom.py b/compiler/datasheet/wavedrom.py deleted file mode 100644 index e8c68c56..00000000 --- a/compiler/datasheet/wavedrom.py +++ /dev/null @@ -1,827 +0,0 @@ -#!/usr/bin/python -# The MIT License (MIT) -# -# Copyright (c) 2011-2016 Aliaksei Chapyzhenka -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. -# -# Translated to Python from original file: -# https://github.com/drom/wavedrom/blob/master/src/WaveDrom.js -# - -import sys -import json -import math -import waveskin - -font_width = 7 - -lane = { - "xs" : 20, # tmpgraphlane0.width - "ys" : 20, # tmpgraphlane0.height - "xg" : 120, # tmpgraphlane0.x - "yg" : 0, # head gap - "yh0" : 0, # head gap title - "yh1" : 0, # head gap - "yf0" : 0, # foot gap - "yf1" : 0, # foot gap - "y0" : 5, # tmpgraphlane0.y - "yo" : 30, # tmpgraphlane1.y - y0 - "tgo" : -10, # tmptextlane0.x - xg - "ym" : 15, # tmptextlane0.y - y0 - "xlabel" : 6, # tmptextlabel.x - xg - "xmax" : 1, - "scale" : 1, - "head" : {}, - "foot" : {} -} - -def genBrick (texts, extra, times) : - - R = [] - if len( texts ) == 4 : - for j in range( times ): - - R.append(texts[0]) - - for i in range ( extra ): - R.append(texts[1]) - - R.append(texts[2]) - for i in range ( extra ): - R.append(texts[3]) - - return R - - if len( texts ) == 1 : - texts.append(texts[0]) - - R.append(texts[0]) - for i in range (times * (2 * (extra + 1)) - 1) : - R.append(texts[1]) - return R - -def genFirstWaveBrick (text, extra, times) : - - pattern = { - 'p': ['pclk', '111', 'nclk', '000'], - 'n': ['nclk', '000', 'pclk', '111'], - 'P': ['Pclk', '111', 'nclk', '000'], - 'N': ['Nclk', '000', 'pclk', '111'], - 'l': ['000'], - 'L': ['000'], - '0': ['000'], - 'h': ['111'], - 'H': ['111'], - '1': ['111'], - '=': ['vvv-2'], - '2': ['vvv-2'], - '3': ['vvv-3'], - '4': ['vvv-4'], - '5': ['vvv-5'], - 'd': ['ddd'], - 'u': ['uuu'], - 'z': ['zzz'] - } - - return genBrick( pattern.get( text, ['xxx'] ) , extra, times ); - -def genWaveBrick (text, extra, times) : - - x1 = {'p':'pclk', 'n':'nclk', 'P':'Pclk', 'N':'Nclk', 'h':'pclk', 'l':'nclk', 'H':'Pclk', 'L':'Nclk'} - x2 = {'0':'0', '1':'1', 'x':'x', 'd':'d', 'u':'u', 'z':'z', '=':'v', '2':'v', '3':'v', '4':'v', '5':'v' } - x3 = {'0': '', '1': '', 'x': '', 'd': '', 'u': '', 'z': '', '=':'-2', '2':'-2', '3':'-3', '4':'-4', '5':'-5'} - y1 = { - 'p':'0', 'n':'1', - 'P':'0', 'N':'1', - 'h':'1', 'l':'0', - 'H':'1', 'L':'0', - '0':'0', '1':'1', 'x':'x', 'd':'d', 'u':'u', 'z':'z', '=':'v', '2':'v', '3':'v', '4':'v', '5':'v'} - - y2 = { - 'p': '', 'n': '', - 'P': '', 'N': '', - 'h': '', 'l': '', - 'H': '', 'L': '', - '0': '', '1': '', 'x': '', 'd': '', 'u': '', 'z': '', '=':'-2', '2':'-2', '3':'-3', '4':'-4', '5':'-5'} - - x4 = { - 'p': '111', 'n': '000', - 'P': '111', 'N': '000', - 'h': '111', 'l': '000', - 'H': '111', 'L': '000', - '0': '000', '1': '111', 'x': 'xxx', 'd': 'ddd', 'u': 'uuu', 'z': 'zzz', - '=': 'vvv-2', '2': 'vvv-2', '3': 'vvv-3', '4': 'vvv-4', '5': 'vvv-5'} - - x5 = {'p':'nclk', 'n':'pclk', 'P':'nclk', 'N':'pclk'} - x6 = {'p': '000', 'n': '111', 'P': '000', 'N': '111'} - xclude = {'hp':'111', 'Hp':'111', 'ln': '000', 'Ln': '000', 'nh':'111', 'Nh':'111', 'pl': '000', 'Pl':'000'} - - #atext = text.split() - atext = text - - tmp0 = x4.get(atext[1]) - tmp1 = x1.get(atext[1]) - if tmp1 == None : - tmp2 = x2.get(atext[1]) - if tmp2 == None : - # unknown - return genBrick(['xxx'], extra, times) - else : - tmp3 = y1.get(atext[0]) - if tmp3 == None : - # unknown - return genBrick(['xxx'], extra, times) - - # soft curves - return genBrick([tmp3 + 'm' + tmp2 + y2[atext[0]] + x3[atext[1]], tmp0], extra, times) - - else : - tmp4 = xclude.get(text) - if tmp4 != None : - tmp1 = tmp4 - - # sharp curves - tmp2 = x5.get(atext[1]) - if tmp2 == None : - # hlHL - return genBrick([tmp1, tmp0], extra, times) - else : - # pnPN - return genBrick([tmp1, tmp0, tmp2, x6[atext[1]]], extra, times) - -def parseWaveLane (text, extra) : - - R = [] - Stack = text - Next = Stack[0] - Stack = Stack[1:] - - Repeats = 1 - while len(Stack) and ( Stack[0] == '.' or Stack[0] == '|' ): # repeaters parser - Stack=Stack[1:] - Repeats += 1 - - R.extend(genFirstWaveBrick(Next, extra, Repeats)) - - while len(Stack) : - Top = Next - Next = Stack[0] - Stack = Stack[1:] - Repeats = 1 - while len(Stack) and ( Stack[0] == '.' or Stack[0] == '|' ) : # repeaters parser - Stack=Stack[1:] - Repeats += 1 - R.extend(genWaveBrick((Top + Next), extra, Repeats)) - - for i in range( lane['phase'] ): - R = R[1:] - return R - -def parseWaveLanes (sig) : - - def data_extract (e) : - tmp = e.get('data') - if tmp == None : return None - if is_type_str (tmp) : tmp=tmp.split() - return tmp - - content = [] - for sigx in sig : - lane['period'] = sigx.get('period',1) - lane['phase'] = int( sigx.get('phase',0 ) * 2 ) - sub_content=[] - sub_content.append( [sigx.get('name',' '), sigx.get('phase',0 ) ] ) - sub_content.append( parseWaveLane( sigx['wave'], int(lane['period'] * lane['hscale'] - 1 ) ) if sigx.get('wave') else None ) - sub_content.append( data_extract(sigx) ) - content.append(sub_content) - - return content - -def findLaneMarkers (lanetext) : - - lcount = 0 - gcount = 0 - ret = [] - for i in range( len( lanetext ) ) : - if lanetext[i] == 'vvv-2' or lanetext[i] == 'vvv-3' or lanetext[i] == 'vvv-4' or lanetext[i] == 'vvv-5' : - lcount += 1 - else : - if lcount !=0 : - ret.append(gcount - ((lcount + 1) / 2)) - lcount = 0 - - gcount += 1 - - if lcount != 0 : - ret.append(gcount - ((lcount + 1) / 2)) - - return ret - -def renderWaveLane (root, content, index) : - - xmax = 0 - xgmax = 0 - glengths = [] - svgns = 'http://www.w3.org/2000/svg' - xlinkns = 'http://www.w3.org/1999/xlink' - xmlns = 'http://www.w3.org/XML/1998/namespace' - for j in range( len(content) ): - name = content[j][0][0] - if name : # check name - g = [ - 'g', - { - 'id': 'wavelane_' + str(j) + '_' + str(index), - 'transform': 'translate(0,' + str(lane['y0'] + j * lane['yo']) + ')' - } - ] - root.append(g) - title = [ - 'text', - { - 'x': lane['tgo'], - 'y': lane['ym'], - 'class': 'info', - 'text-anchor': 'end', - 'xml:space': 'preserve' - }, - ['tspan', name] - ] - g.append(title) - - glengths.append( len(name) * font_width + font_width ) - - xoffset = content[j][0][1] - xoffset = math.ceil(2 * xoffset) - 2 * xoffset if xoffset > 0 else -2 * xoffset - gg = [ - 'g', - { - 'id': 'wavelane_draw_' + str(j) + '_' + str(index), - 'transform': 'translate(' + str( xoffset * lane['xs'] ) + ', 0)' - } - ] - g.append(gg) - - if content[j][1] : - for i in range( len(content[j][1]) ) : - b = [ - 'use', - { - #'id': 'use_' + str(i) + '_' + str(j) + '_' + str(index), - 'xmlns:xlink':xlinkns, - 'xlink:href': '#' + str( content[j][1][i] ), - 'transform': 'translate(' + str(i * lane['xs']) + ')' - } - ] - gg.append(b) - - if content[j][2] and len(content[j][2]) : - labels = findLaneMarkers(content[j][1]) - if len(labels) != 0 : - for k in range( len(labels) ) : - if content[j][2] and k < len(content[j][2]) : - title = [ - 'text', - { - 'x': int(labels[k]) * lane['xs'] + lane['xlabel'], - 'y': lane['ym'], - 'text-anchor': 'middle', - 'xml:space': 'preserve' - }, - ['tspan',content[j][2][k]] - ] - gg.append(title) - - - if len(content[j][1]) > xmax : - xmax = len(content[j][1]) - - lane['xmax'] = xmax - lane['xg'] = xgmax + 20 - return glengths - -def renderMarks (root, content, index) : - - def captext ( g, cxt, anchor, y ) : - - if cxt.get(anchor) and cxt[anchor].get('text') : - tmark = [ - 'text', - { - 'x': float( cxt['xmax'] ) * float( cxt['xs'] ) / 2, - 'y': y, - 'text-anchor': 'middle', - 'fill': '#000', - 'xml:space': 'preserve' - }, cxt[anchor]['text'] - ] - g.append(tmark) - - def ticktock ( g, cxt, ref1, ref2, x, dx, y, length ) : - L = [] - - if cxt.get(ref1) == None or cxt[ref1].get(ref2) == None : - return - - val = cxt[ref1][ref2] - if is_type_str( val ) : - val = val.split() - elif type( val ) is int : - offset = val - val = [] - for i in range ( length ) : - val.append(i + offset) - - if type( val ) is list : - if len( val ) == 0 : - return - elif len( val ) == 1 : - offset = val[0] - if is_type_str(offset) : - L = val - else : - for i in range ( length ) : - L[i] = i + offset - - elif len( val ) == 2: - offset = int(val[0]) - step = int(val[1]) - tmp = val[1].split('.') - if len( tmp ) == 2 : - dp = len( tmp[1] ) - - if is_type_str(offset) or is_type_str(step) : - L = val - else : - offset = step * offset - for i in range( length ) : - L[i] = "{0:.",dp,"f}".format(step * i + offset) - - else : - L = val - - else : - return - - for i in range( length ) : - tmp = L[i] - tmark = [ - 'text', - { - 'x': i * dx + x, - 'y': y, - 'text-anchor': 'middle', - 'class': 'muted', - 'xml:space': 'preserve' - }, str(tmp) - ] - g.append(tmark) - - mstep = 2 * int(lane['hscale']) - mmstep = mstep * lane['xs'] - marks = int( lane['xmax'] / mstep ) - gy = len( content ) * int(lane['yo']) - - g = ['g', {'id': 'gmarks_' + str(index)}] - root.insert(0,g) - - for i in range( marks + 1): - gg = [ - 'path', - { - 'id': 'gmark_' + str(i) + '_' + str(index), - 'd': 'm ' + str(i * mmstep) + ',' + '0' + ' 0,' + str(gy), - 'style': 'stroke:#888;stroke-width:0.5;stroke-dasharray:1,3' - } - ] - g.append( gg ) - - captext(g, lane, 'head', -33 if lane['yh0'] else -13 ) - captext(g, lane, 'foot', gy + ( 45 if lane['yf0'] else 25 ) ) - - ticktock( g, lane, 'head', 'tick', 0, mmstep, -5, marks + 1) - ticktock( g, lane, 'head', 'tock', mmstep / 2, mmstep, -5, marks) - ticktock( g, lane, 'foot', 'tick', 0, mmstep, gy + 15, marks + 1) - ticktock( g, lane, 'foot', 'tock', mmstep / 2, mmstep, gy + 15, marks) - -def renderArcs (root, source, index, top) : - - Stack = [] - Edge = {'words': [], 'frm': 0, 'shape': '', 'to': 0, 'label': ''} - Events = {} - svgns = 'http://www.w3.org/2000/svg' - xmlns = 'http://www.w3.org/XML/1998/namespace' - - if source : - for i in range (len (source) ) : - lane['period'] = source[i].get('period',1) - lane['phase'] = int( source[i].get('phase',0 ) * 2 ) - text = source[i].get('node') - if text: - Stack = text - pos = 0 - while len( Stack ) : - eventname = Stack[0] - Stack=Stack[1:] - if eventname != '.' : - Events[eventname] = { - 'x' : str( int( float( lane['xs'] ) * (2 * pos * lane['period'] * lane['hscale'] - lane['phase'] ) + float( lane['xlabel'] ) ) ), - 'y' : str( int( i * lane['yo'] + lane['y0'] + float( lane['ys'] ) * 0.5 ) ) - } - pos += 1 - - gg = [ 'g', { 'id' : 'wavearcs_' + str( index ) } ] - root.append(gg) - - if top.get('edge') : - for i in range( len ( top['edge'] ) ) : - Edge['words'] = top['edge'][i].split() - Edge['label'] = top['edge'][i][len(Edge['words'][0]):] - Edge['label'] = Edge['label'][1:] - Edge['frm'] = Edge['words'][0][0] - Edge['to'] = Edge['words'][0][-1] - Edge['shape'] = Edge['words'][0][1:-1] - frm = Events[Edge['frm']] - to = Events[Edge['to']] - gmark = [ - 'path', - { - 'id': 'gmark_' + Edge['frm'] + '_' + Edge['to'], - 'd': 'M ' + frm['x'] + ',' + frm['y'] + ' ' + to['x'] + ',' + to['y'], - 'style': 'fill:none;stroke:#00F;stroke-width:1' - } - ] - gg.append(gmark) - dx = float( to['x'] ) - float( frm['x'] ) - dy = float( to['y'] ) - float( frm['y'] ) - lx = (float(frm['x']) + float(to['x'])) / 2 - ly = (float(frm['y']) + float(to['y'])) / 2 - pattern = { - '~' : {'d': 'M ' + frm['x'] + ',' + frm['y'] + ' c ' + str(0.7 * dx) + ', 0 ' + str(0.3 * dx) + ', ' + str(dy) + ' ' + str(dx) + ', ' + str(dy) }, - '-~' : {'d': 'M ' + frm['x'] + ',' + frm['y'] + ' c ' + str(0.7 * dx) + ', 0 ' + str(dx) + ', ' + str(dy) + ' ' + str(dx) + ', ' + str(dy) }, - '~-' : {'d': 'M ' + frm['x'] + ',' + frm['y'] + ' c ' + '0' + ', 0 ' + str(0.3 * dx) + ', ' + str(dy) + ' ' + str(dx) + ', ' + str(dy) }, - '-|' : {'d': 'm ' + frm['x'] + ',' + frm['y'] + ' ' + str(dx) + ',0 0,' + str(dy)}, - '|-' : {'d': 'm ' + frm['x'] + ',' + frm['y'] + ' 0,' + str(dy) + ' ' + str(dx) + ',0'}, - '-|-' : {'d': 'm ' + frm['x'] + ',' + frm['y'] + ' ' + str(dx / 2) + ',0 0,' + str(dy) + ' ' + str(dx / 2) + ',0'}, - '->' : {'style': 'marker-end:url(#arrowhead);stroke:#0041c4;stroke-width:1;fill:none'}, - '~>' : {'style': 'marker-end:url(#arrowhead);stroke:#0041c4;stroke-width:1;fill:none', 'd': 'M ' + frm['x'] + ',' + frm['y'] + ' ' + 'c ' + str(0.7 * dx) + ', 0 ' + str(0.3 * dx) + ', ' + str(dy) + ' ' + str(dx) + ', ' + str(dy)}, - '-~>' : {'style': 'marker-end:url(#arrowhead);stroke:#0041c4;stroke-width:1;fill:none', 'd': 'M ' + frm['x'] + ',' + frm['y'] + ' ' + 'c ' + str(0.7 * dx) + ', 0 ' + str(dx) + ', ' + str(dy) + ' ' + str(dx) + ', ' + str(dy)}, - '~->' : {'style': 'marker-end:url(#arrowhead);stroke:#0041c4;stroke-width:1;fill:none', 'd': 'M ' + frm['x'] + ',' + frm['y'] + ' ' + 'c ' + '0' + ', 0 ' + str(0.3 * dx) + ', ' + str(dy) + ' ' + str(dx) + ', ' + str(dy)}, - '-|>' : {'style': 'marker-end:url(#arrowhead);stroke:#0041c4;stroke-width:1;fill:none', 'd': 'm ' + frm['x'] + ',' + frm['y'] + ' ' + str(dx) + ',0 0,' + str(dy)}, - '|->' : {'style': 'marker-end:url(#arrowhead);stroke:#0041c4;stroke-width:1;fill:none', 'd': 'm ' + frm['x'] + ',' + frm['y'] + ' 0,' + str(dy) + ' ' + str(dx) + ',0'}, - '-|->' : {'style': 'marker-end:url(#arrowhead);stroke:#0041c4;stroke-width:1;fill:none', 'd': 'm ' + frm['x'] + ',' + frm['y'] + ' ' + str(dx / 2) + ',0 0,' + str(dy) + ' ' + str(dx / 2) + ',0'}, - '<->' : {'style': 'marker-end:url(#arrowhead);marker-start:url(#arrowtail);stroke:#0041c4;stroke-width:1;fill:none'}, - '<~>' : {'style': 'marker-end:url(#arrowhead);marker-start:url(#arrowtail);stroke:#0041c4;stroke-width:1;fill:none','d': 'M ' + frm['x'] + ',' + frm['y'] + ' ' + 'c ' + str(0.7 * dx) + ', 0 ' + str(0.3 * dx) + ', ' + str(dy) + ' ' + str(dx) + ', ' + str(dy)}, - '<-~>' : {'style': 'marker-end:url(#arrowhead);marker-start:url(#arrowtail);stroke:#0041c4;stroke-width:1;fill:none','d': 'M ' + frm['x'] + ',' + frm['y'] + ' ' + 'c ' + str(0.7 * dx) + ', 0 ' + str(dx) + ', ' + str(dy) + ' ' + str(dx) + ', ' + str(dy)}, - '<-|>' : {'style': 'marker-end:url(#arrowhead);marker-start:url(#arrowtail);stroke:#0041c4;stroke-width:1;fill:none','d': 'm ' + frm['x'] + ',' + frm['y'] + ' ' + str(dx) + ',0 0,' + str(dy)}, - '<-|->': {'style': 'marker-end:url(#arrowhead);marker-start:url(#arrowtail);stroke:#0041c4;stroke-width:1;fill:none','d': 'm ' + frm['x'] + ',' + frm['y'] + ' ' + str(dx / 2) + ',0 0,' + str(dy) + ' ' + str(dx / 2) + ',0'} - } - gmark[1].update( pattern.get( Edge['shape'], { 'style': 'fill:none;stroke:#00F;stroke-width:1' } ) ) - - if Edge['label']: - if Edge['shape'] == '-~' : - lx = float(frm['x']) + (float(to['x']) - float(frm['x'])) * 0.75 - if Edge['shape'] == '~-' : - lx = float(frm['x']) + (float(to['x']) - float(frm['x'])) * 0.25 - if Edge['shape'] == '-|' : - lx = float(to['x']) - if Edge['shape'] == '|-' : - lx = float(frm['x']) - if Edge['shape'] == '-~>': - lx = float(frm['x']) + (float(to['x']) - float(frm['x'])) * 0.75 - if Edge['shape'] == '~->': - lx = float(frm['x']) + (float(to['x']) - float(frm['x'])) * 0.25 - if Edge['shape'] == '-|>' : - lx = float(to['x']) - if Edge['shape'] == '|->' : - lx = float(frm['x']) - if Edge['shape'] == '<-~>': - lx = float(frm['x']) + (float(to['x']) - float(frm['x'])) * 0.75 - if Edge['shape'] =='<-|>' : - lx = float(to['x']) - - lwidth = len( Edge['label'] ) * font_width - label = [ - 'text', - { - 'style': 'font-size:10px;', - 'text-anchor': 'middle', - 'xml:space': 'preserve', - 'x': int( lx ), - 'y': int( ly + 3 ) - }, - [ 'tspan', Edge['label'] ] - ] - underlabel = [ - 'rect', - { - 'height': 9, - 'style': 'fill:#FFF;', - 'width': lwidth, - 'x': int( lx - lwidth / 2 ), - 'y': int( ly - 5 ) - } - ] - gg.append(underlabel) - gg.append(label) - - for k in Events: - if k.islower() : - if int( Events[k]['x'] ) > 0 : - lwidth = len( k ) * font_width - underlabel = [ - 'rect', - { - 'x': float( Events[k]['x'] ) - float(lwidth) / 2, - 'y': int( Events[k]['y'] ) - 4, - 'height': 8, - 'width': lwidth, - 'style': 'fill:#FFF;' - } - ] - gg.append(underlabel) - label = [ - 'text', - { - 'style': 'font-size:8px;', - 'x': int( Events[k]['x'] ), - 'y': int( Events[k]['y'] ) + 2, - 'width': lwidth, - 'text-anchor': 'middle' - }, - k - ] - gg.append(label) - -def parseConfig (source) : - - lane['hscale'] = 1 - if lane.get('hscale0') : - lane['hscale'] = lane['hscale0'] - - if source and source.get('config') and source.get('config').get('hscale'): - hscale = round(source.get('config').get('hscale')) - if hscale > 0 : - if hscale > 100 : hscale = 100 - lane['hscale'] = hscale - - lane['yh0'] = 0 - lane['yh1'] = 0 - if source and source.get('head') : - lane['head'] = source['head'] - if source.get('head').get('tick',0) == 0 : lane['yh0'] = 20 - if source.get('head').get('tock',0) == 0 : lane['yh0'] = 20 - if source.get('head').get('text') : lane['yh1'] = 46; lane['head']['text'] = source['head']['text'] - - lane['yf0'] = 0 - lane['yf1'] = 0 - if source and source.get('foot') : - lane['foot'] = source['foot'] - if source.get('foot').get('tick',0) == 0 : lane['yf0'] = 20 - if source.get('foot').get('tock',0) == 0 : lane['yf0'] = 20 - if source.get('foot').get('text') : lane['yf1'] = 46; lane['foot']['text'] = source['foot']['text'] - -def rec (tmp, state) : - - name = str( tmp[0] ) - delta_x = 25 - - state['x'] += delta_x - for i in range( len( tmp ) ) : - if type( tmp[i] ) is list : - old_y = state['y'] - rec( tmp[i], state ) - state['groups'].append( {'x':state['xx'], 'y':old_y, 'height':state['y'] - old_y, 'name': state['name'] } ) - elif type( tmp[i] ) is dict : - state['lanes'].append(tmp[i]) - state['width'].append(state['x']) - state['y'] += 1 - - state['xx'] = state['x'] - state['x'] -= delta_x - state['name'] = name - -def insertSVGTemplate (index, parent, source) : - - e = waveskin.WaveSkin['default'] - - if source.get('config') and source.get('config').get('skin') : - if waveskin.WaveSkin.get( source.get('config').get('skin') ) : - e = waveskin.WaveSkin[ source.get('config').get('skin') ] - - if index == 0 : - lane['xs'] = int( e[3][1][2][1]['width'] ) - lane['ys'] = int( e[3][1][2][1]['height'] ) - lane['xlabel'] = int( e[3][1][2][1]['x'] ) - lane['ym'] = int( e[3][1][2][1]['y'] ) - - else : - e = ['svg', {'id': 'svg', 'xmlns': 'http://www.w3.org/2000/svg', 'xmlns:xlink': 'http://www.w3.org/1999/xlink', 'height': '0'}, - ['g', {'id': 'waves'}, - ['g', {'id': 'lanes'}], - ['g', {'id': 'groups'}] - ] - ] - - e[-1][1]['id'] = 'waves_' + str(index) - e[-1][2][1]['id'] = 'lanes_' + str(index) - e[-1][3][1]['id'] = 'groups_' + str(index) - e[1]['id'] = 'svgcontent_' + str(index) - e[1]['height'] = 0 - - parent.extend(e) - -def renderWaveForm (index, source, output) : - - xmax = 0 - root = [] - groups = [] - - if source.get('signal'): - insertSVGTemplate(index, output, source) - parseConfig( source ) - ret = {'x':0, 'y':0, 'xmax':0, 'width':[], 'lanes':[], 'groups':[] } - rec( source['signal'], ret ) - content = parseWaveLanes(ret['lanes']) - glengths = renderWaveLane(root, content, index) - for i in range( len( glengths ) ): - xmax = max( xmax, ( glengths[i] + ret['width'][i] ) ) - renderMarks(root, content, index) - renderArcs(root, ret['lanes'], index, source) - renderGaps(root, ret['lanes'], index) - renderGroups(groups, ret['groups'], index) - lane['xg'] = int( math.ceil( float( xmax - lane['tgo'] ) / float(lane['xs'] ) ) ) * lane['xs'] - width = (lane['xg'] + lane['xs'] * (lane['xmax'] + 1) ) - height = len(content) * lane['yo'] + lane['yh0'] + lane['yh1'] + lane['yf0'] + lane['yf1'] - output[1]={ - 'id' :'svgcontent_' + str(index), - 'xmlns' :"http://www.w3.org/2000/svg", - 'xmlns:xlink':"http://www.w3.org/1999/xlink", - 'width' :str(width), - 'height' :str(height), - 'viewBox' :'0 0 ' + str(width) + ' ' + str(height), - 'overflow' :"hidden" - } - output[-1][2][1]['transform']='translate(' + str(lane['xg'] + 0.5) + ', ' + str((float(lane['yh0']) + float(lane['yh1'])) + 0.5) + ')' - - output[-1][2].extend(root) - output[-1][3].extend(groups) - -def renderGroups (root, groups, index) : - - svgns = 'http://www.w3.org/2000/svg', - xmlns = 'http://www.w3.org/XML/1998/namespace' - - for i in range( len( groups ) ) : - group = [ - 'path', - { - 'id': 'group_' + str(i) + '_' + str(index), - 'd': 'm ' + str( groups[i]['x'] + 0.5 ) + ',' + str( groups[i]['y']* lane['yo'] + 3.5 + lane['yh0'] + lane['yh1'] ) + ' c -3,0 -5,2 -5,5 l 0,' + str( int( groups[i]['height'] * lane['yo'] - 16 ) ) + ' c 0,3 2,5 5,5', - 'style': 'stroke:#0041c4;stroke-width:1;fill:none' - } - ] - root.append(group) - - name = groups[i]['name'] - x = str( int( groups[i]['x'] - 10 ) ) - y = str( int( lane['yo'] * (groups[i]['y'] + (float(groups[i]['height']) / 2)) + lane['yh0'] + lane['yh1'] ) ) - label = [ - ['g', - {'transform': 'translate(' + x + ',' + y + ')'}, - ['g', {'transform': 'rotate(270)'}, - 'text', - { - 'text-anchor': 'middle', - 'class': 'info', - 'xml:space' : 'preserve' - }, - ['tspan',name] - ] - ] - ] - root.append(label) - -def renderGaps (root, source, index) : - - Stack = [] - svgns = 'http://www.w3.org/2000/svg', - xlinkns = 'http://www.w3.org/1999/xlink' - - if source: - - gg = [ - 'g', - { 'id': 'wavegaps_' + str(index) } - ] - - for i in range( len( source )): - lane['period'] = source[i].get('period',1) - lane['phase'] = int( source[i].get('phase',0 ) * 2 ) - - g = [ - 'g', - { - 'id': 'wavegap_' + str(i) + '_' + str(index), - 'transform': 'translate(0,' + str(lane['y0'] + i * lane['yo']) + ')' - } - ] - gg.append(g) - - if source[i].get('wave'): - text = source[i]['wave'] - Stack = text - pos = 0 - while len( Stack ) : - c = Stack [0] - Stack = Stack[1:] - if c == '|' : - b = [ - 'use', - { - 'xmlns:xlink':xlinkns, - 'xlink:href':'#gap', - 'transform': 'translate(' + str(int(float(lane['xs']) * ((2 * pos + 1) * float(lane['period']) * float(lane['hscale']) - float(lane['phase'])))) + ')' - } - ] - g.append(b) - pos += 1 - - root.append( gg ) - -def is_type_str( var ) : - if sys.version_info[0] < 3: - return type( var ) is str or type( var ) is unicode - else: - return type( var ) is str - -def convert_to_svg( root ) : - - svg_output = '' - - if type( root ) is list: - if len(root) >= 2 and type( root[1] ) is dict: - if len( root ) == 2 : - svg_output += '<' + root[0] + convert_to_svg( root[1] ) + '/>\n' - elif len( root ) >= 3 : - svg_output += '<' + root[0] + convert_to_svg( root[1] ) + '>\n' - if len( root ) == 3: - svg_output += convert_to_svg( root[2] ) - else: - svg_output += convert_to_svg( root[2:] ) - svg_output += '\n' - elif type( root[0] ) is list: - for eleml in root: - svg_output += convert_to_svg( eleml ) - else: - svg_output += '<' + root[0] + '>\n' - for eleml in root[1:]: - svg_output += convert_to_svg( eleml ) - svg_output += '\n' - elif type( root ) is dict: - for elemd in root : - svg_output += ' ' + elemd + '="' + str(root[elemd]) + '"' - else: - svg_output += root - - return svg_output - -if __name__ == '__main__': - - if len( sys.argv ) != 5: - print ( 'Usage : ' + sys.argv[0] + ' source svg ' ) - exit(1) - - if sys.argv[3] != 'svg' : - print ( 'Error: only SVG format supported.' ) - exit(1) - - output=[] - inputfile = sys.argv[2] - outputfile = sys.argv[4] - - with open(inputfile,'r') as f: - jinput = json.load(f) - - renderWaveForm(0,jinput,output) - svg_output = convert_to_svg(output) - - with open(outputfile,'w') as f: - f.write( svg_output ) diff --git a/compiler/debug.py b/compiler/debug.py index e6c6a1bd..9ce1bf3f 100644 --- a/compiler/debug.py +++ b/compiler/debug.py @@ -48,17 +48,35 @@ def print_raw(str): def log(str): - if log.create_file: - compile_log = open(globals.OPTS.output_path + - globals.OPTS.output_name + '.log', "w") - log.create_file = 0 + if globals.OPTS.output_name != '': + if log.create_file: + # We may have not yet read the config, so we need to ensure + # it ends with a / + # This is also done in read_config if we change the path + # FIXME: There's actually a bug here. The first few lines + # could be in one log file and after read_config it could be + # in another log file if the path or name changes. + if not globals.OPTS.output_path.endswith('/'): + globals.OPTS.output_path += "/" + compile_log = open(globals.OPTS.output_path + + globals.OPTS.output_name + '.log', "w+") + log.create_file = 0 + else: + compile_log = open(globals.OPTS.output_path + + globals.OPTS.output_name + '.log', "a") + + if len(log.setup_output) != 0: + for line in log.setup_output: + compile_log.write(line) + log.setup_output = [] + compile_log.write(str + '\n') else: - compile_log = open(globals.OPTS.output_path + - globals.OPTS.output_name + '.log', "a") - compile_log.write(str + '\n') -log.create_file = 1 + log.setup_output.append(str + "\n") +# use a static list of strings to store messages until the global paths are set up +log.setup_output = [] +log.create_file = 1 def info(lev, str): @@ -71,5 +89,5 @@ def info(lev, str): class_name = "" else: class_name = mod.__name__ - print_raw("[{0}/{1}]: {2}".format(class_name, frm[0].f_code.co_name, str)) - + print_raw("[{0}/{1}]: {2}".format(class_name, + frm[0].f_code.co_name, str)) diff --git a/compiler/example_configs/example_config_1rw_1r_scn4m_subm.py b/compiler/example_configs/example_config_1rw_1r_scn4m_subm.py index 4d09cfee..8703967b 100644 --- a/compiler/example_configs/example_config_1rw_1r_scn4m_subm.py +++ b/compiler/example_configs/example_config_1rw_1r_scn4m_subm.py @@ -1,8 +1,6 @@ word_size = 2 num_words = 16 -bitcell = "bitcell_1rw_1r" -replica_bitcell = "replica_bitcell_1rw_1r" num_rw_ports = 1 num_r_ports = 1 num_w_ports = 0 diff --git a/compiler/example_configs/example_config_1w_1r_scn4m_subm.py b/compiler/example_configs/example_config_1w_1r_scn4m_subm.py new file mode 100644 index 00000000..56f6edfd --- /dev/null +++ b/compiler/example_configs/example_config_1w_1r_scn4m_subm.py @@ -0,0 +1,18 @@ +word_size = 2 +num_words = 16 + +num_rw_ports = 1 +num_r_ports = 1 +num_w_ports = 0 + +tech_name = "scn4m_subm" +process_corners = ["TT"] +supply_voltages = [5.0] +temperatures = [25] + +output_path = "temp" +output_name = "sram_1w_1r_{0}_{1}_{2}".format(word_size,num_words,tech_name) + +drc_name = "magic" +lvs_name = "netgen" +pex_name = "magic" diff --git a/compiler/git_id b/compiler/git_id deleted file mode 100644 index e1aa211f..00000000 --- a/compiler/git_id +++ /dev/null @@ -1 +0,0 @@ -468eb9a4a038201c2b0004fe6e4ae9b2d37fdd57 diff --git a/compiler/globals.py b/compiler/globals.py index f162edda..c1422592 100644 --- a/compiler/globals.py +++ b/compiler/globals.py @@ -132,6 +132,8 @@ def init_openram(config_file, is_unit_test=True): from sram_factory import factory factory.reset() + + setup_bitcell() # Reset the static duplicate name checker for unit tests. import hierarchy_design @@ -157,6 +159,46 @@ def init_openram(config_file, is_unit_test=True): if not CHECKPOINT_OPTS: CHECKPOINT_OPTS = copy.copy(OPTS) +def setup_bitcell(): + """ + Determine the correct custom or parameterized bitcell for the design. + """ + global OPTS + + # If we have non-1rw ports, + # and the user didn't over-ride the bitcell manually, + # figure out the right bitcell to use + if (OPTS.bitcell=="bitcell" and OPTS.replica_bitcell=="replica_bitcell"): + + if (OPTS.num_rw_ports==1 and OPTS.num_w_ports==0 and OPTS.num_r_ports==0): + OPTS.bitcell = "bitcell" + OPTS.replica_bitcell = "replica_bitcell" + else: + ports = "" + if OPTS.num_rw_ports>0: + ports += "{}rw_".format(OPTS.num_rw_ports) + if OPTS.num_w_ports>0: + ports += "{}w_".format(OPTS.num_w_ports) + if OPTS.num_r_ports>0: + ports += "{}r".format(OPTS.num_r_ports) + + OPTS.bitcell = "bitcell_"+ports + OPTS.replica_bitcell = "replica_bitcell_"+ports + + # See if a custom bitcell exists + from importlib import find_loader + bitcell_loader = find_loader(OPTS.bitcell) + replica_bitcell_loader = find_loader(OPTS.replica_bitcell) + # Use the pbitcell if we couldn't find a custom bitcell + # or its custom replica bitcell + if bitcell_loader==None or replica_bitcell_loader==None: + # Use the pbitcell (and give a warning if not in unit test mode) + OPTS.bitcell = "pbitcell" + OPTS.replica_bitcell = "replica_pbitcell" + if not OPTS.is_unit_test: + debug.warning("Using the parameterized bitcell which may have suboptimal density.") + + debug.info(1,"Using bitcell: {}".format(OPTS.bitcell)) def get_tool(tool_type, preferences, default_name=None): @@ -250,7 +292,8 @@ def read_config(config_file, is_unit_test=True): OPTS.num_words, ports, OPTS.tech_name) - + + def end_openram(): @@ -417,7 +460,11 @@ def report_status(): debug.error("Tech name must be specified in config file.") debug.print_raw("Technology: {0}".format(OPTS.tech_name)) - debug.print_raw("Total size: {} bits".format(OPTS.word_size*OPTS.num_words*OPTS.num_banks)) + total_size = OPTS.word_size*OPTS.num_words*OPTS.num_banks + debug.print_raw("Total size: {} bits".format(total_size)) + if total_size>=2**14: + debug.warning("Requesting such a large memory size ({0}) will have a large run-time. ".format(total_size) + + "Consider using multiple smaller banks.") debug.print_raw("Word size: {0}\nWords: {1}\nBanks: {2}".format(OPTS.word_size, OPTS.num_words, OPTS.num_banks)) diff --git a/compiler/modules/bank.py b/compiler/modules/bank.py index 5d4e9739..7eddc3bb 100644 --- a/compiler/modules/bank.py +++ b/compiler/modules/bank.py @@ -1216,26 +1216,30 @@ class bank(design.design): rotate=90) - def analytical_delay(self, vdd, slew, load): + def analytical_delay(self, corner, slew, load): """ return analytical delay of the bank""" results = [] - decoder_delay = self.row_decoder.analytical_delay(slew, self.wordline_driver.input_load()) + decoder_delay = self.row_decoder.analytical_delay(corner, slew, self.wordline_driver.input_load()) - word_driver_delay = self.wordline_driver.analytical_delay(decoder_delay.slew, self.bitcell_array.input_load()) + word_driver_delay = self.wordline_driver.analytical_delay(corner, + decoder_delay.slew, + self.bitcell_array.input_load()) #FIXME: Array delay is the same for every port. - bitcell_array_delay = self.bitcell_array.analytical_delay(word_driver_delay.slew) + bitcell_array_delay = self.bitcell_array.analytical_delay(corner, word_driver_delay.slew) #This also essentially creates the same delay for each port. Good structure, no substance for port in self.all_ports: if self.words_per_row > 1: - column_mux_delay = self.column_mux_array[port].analytical_delay(vdd, bitcell_array_delay.slew, - self.sense_amp_array.input_load()) + column_mux_delay = self.column_mux_array[port].analytical_delay(corner, + bitcell_array_delay.slew, + self.sense_amp_array.input_load()) else: column_mux_delay = self.return_delay(delay = 0.0, slew=word_driver_delay.slew) - bl_t_data_out_delay = self.sense_amp_array.analytical_delay(column_mux_delay.slew, + bl_t_data_out_delay = self.sense_amp_array.analytical_delay(corner, + column_mux_delay.slew, self.bitcell_array.output_load()) # output load of bitcell_array is set to be only small part of bl for sense amp. results.append(decoder_delay + word_driver_delay + bitcell_array_delay + column_mux_delay + bl_t_data_out_delay) diff --git a/compiler/modules/bitcell_array.py b/compiler/modules/bitcell_array.py index 67e5a9da..ea8fc3f2 100644 --- a/compiler/modules/bitcell_array.py +++ b/compiler/modules/bitcell_array.py @@ -130,7 +130,7 @@ class bitcell_array(design.design): self.add_power_pin(pin_name, pin.center(), 0, pin.layer) - def analytical_delay(self, slew, load=0): + def analytical_delay(self, corner, slew, load=0): from tech import drc wl_wire = self.gen_wl_wire() wl_wire.return_delay_over_wire(slew) @@ -141,25 +141,25 @@ class bitcell_array(design.design): cell_load = 2 * bl_wire.return_input_cap() # we ingore the wire r # hence just use the whole c bl_swing = 0.1 - cell_delay = self.cell.analytical_delay(wl_to_cell_delay.slew, cell_load, swing = bl_swing) + cell_delay = self.cell.analytical_delay(corner, wl_to_cell_delay.slew, cell_load, swing = bl_swing) #we do not consider the delay over the wire for now return self.return_delay(cell_delay.delay+wl_to_cell_delay.delay, wl_to_cell_delay.slew) - def analytical_power(self, proc, vdd, temp, load): + def analytical_power(self, corner, load): """Power of Bitcell array and bitline in nW.""" - from tech import drc + from tech import drc, parameter # Dynamic Power from Bitline bl_wire = self.gen_bl_wire() cell_load = 2 * bl_wire.return_input_cap() - bl_swing = 0.1 #This should probably be defined in the tech file or input + bl_swing = parameter["rbl_height_percentage"] freq = spice["default_event_rate"] - bitline_dynamic = bl_swing*cell_load*vdd*vdd*freq #not sure if calculation is correct + bitline_dynamic = self.calc_dynamic_power(corner, cell_load, freq, swing=bl_swing) #Calculate the bitcell power which currently only includes leakage - cell_power = self.cell.analytical_power(proc, vdd, temp, load) + cell_power = self.cell.analytical_power(corner, load) #Leakage power grows with entire array and bitlines. total_power = self.return_power(cell_power.dynamic + bitline_dynamic * self.column_size, diff --git a/compiler/modules/control_logic.py b/compiler/modules/control_logic.py index d4597cf9..b8532ee9 100644 --- a/compiler/modules/control_logic.py +++ b/compiler/modules/control_logic.py @@ -30,13 +30,15 @@ class control_logic(design.design): self.port_type = port_type self.num_cols = word_size*words_per_row - self.num_words = num_rows * words_per_row + self.num_words = num_rows*words_per_row - self.enable_delay_chain_resizing = False + self.enable_delay_chain_resizing = True - #self.sram=None #disable re-sizing for debugging, FIXME: resizing is not working, needs to be adjusted for new control logic. - self.wl_timing_tolerance = 1 #Determines how much larger the sen delay should be. Accounts for possible error in model. - self.parasitic_inv_delay = parameter["min_inv_para_delay"] #Keeping 0 for now until further testing. + #Determines how much larger the sen delay should be. Accounts for possible error in model. + self.wl_timing_tolerance = 1 + self.parasitic_inv_delay = parameter["min_inv_para_delay"] + self.wl_stage_efforts = None + self.sen_stage_efforts = None if self.port_type == "rw": self.num_control_signals = 2 @@ -130,43 +132,61 @@ class control_logic(design.design): self.add_mod(self.p_en_bar_driver) if (self.port_type == "rw") or (self.port_type == "r"): - delay_stages_heuristic, delay_fanout_heuristic = self.get_heuristic_delay_chain_size() - bitcell_loads = int(math.ceil(self.num_rows / 2.0)) - self.replica_bitline = factory.create(module_type="replica_bitline", - delay_fanout_list=[delay_fanout_heuristic]*delay_stages_heuristic, - bitcell_loads=bitcell_loads) - - - if self.sram != None: - self.set_sen_wl_delays() - - if self.sram != None and self.enable_delay_chain_resizing and not self.does_sen_total_timing_match(): #check condition based on resizing method - #This resizes to match fall and rise delays, can make the delay chain weird sizes. - # stage_list = self.get_dynamic_delay_fanout_list(delay_stages_heuristic, delay_fanout_heuristic) - # self.replica_bitline = replica_bitline(stage_list, bitcell_loads, name="replica_bitline_resized_"+self.port_type) - - #This resizes based on total delay. - delay_stages, delay_fanout = self.get_dynamic_delay_chain_size(delay_stages_heuristic, delay_fanout_heuristic) + from importlib import reload + self.delay_chain_resized = False + c = reload(__import__(OPTS.replica_bitline)) + replica_bitline = getattr(c, OPTS.replica_bitline) + bitcell_loads = int(math.ceil(self.num_rows * parameter["rbl_height_percentage"])) + #Use a model to determine the delays with that heuristic + if OPTS.use_tech_delay_chain_size: #Use tech parameters if set. + fanout_list = parameter["static_fanout_list"] + debug.info(1, "Using tech parameters to size delay chain: fanout_list={}".format(fanout_list)) self.replica_bitline = factory.create(module_type="replica_bitline", - delay_fanout_list=[delay_fanout]*delay_stages, + delay_fanout_list=fanout_list, bitcell_loads=bitcell_loads) - - self.sen_delay_rise,self.sen_delay_fall = self.get_delays_to_sen() #get the new timing + if self.sram != None: #Calculate model value even for specified sizes + self.set_sen_wl_delays() + + else: #Otherwise, use a heuristic and/or model based sizing. + #First use a heuristic + delay_stages_heuristic, delay_fanout_heuristic = self.get_heuristic_delay_chain_size() + self.replica_bitline = factory.create(module_type="replica_bitline", + delay_fanout_list=[delay_fanout_heuristic]*delay_stages_heuristic, + bitcell_loads=bitcell_loads) + #Resize if necessary, condition depends on resizing method + if self.sram != None and self.enable_delay_chain_resizing and not self.does_sen_rise_fall_timing_match(): + #This resizes to match fall and rise delays, can make the delay chain weird sizes. + stage_list = self.get_dynamic_delay_fanout_list(delay_stages_heuristic, delay_fanout_heuristic) + self.replica_bitline = factory.create(module_type="replica_bitline", + delay_fanout_list=stage_list, + bitcell_loads=bitcell_loads) + + #This resizes based on total delay. + # delay_stages, delay_fanout = self.get_dynamic_delay_chain_size(delay_stages_heuristic, delay_fanout_heuristic) + # self.replica_bitline = factory.create(module_type="replica_bitline", + # delay_fanout_list=[delay_fanout]*delay_stages, + # bitcell_loads=bitcell_loads) + + self.sen_delay_rise,self.sen_delay_fall = self.get_delays_to_sen() #get the new timing + self.delay_chain_resized = True self.add_mod(self.replica_bitline) def get_heuristic_delay_chain_size(self): """Use a basic heuristic to determine the size of the delay chain used for the Sense Amp Enable """ - # FIXME: These should be tuned according to the additional size parameters - delay_fanout = 3 # This can be anything >=2 - # Delay stages Must be non-inverting - if self.words_per_row >= 4: + #FIXME: The minimum was 2 fanout, now it will not pass DRC unless it is 3. Why? + delay_fanout = 3 # This can be anything >=3 + # Model poorly captures delay of the column mux. Be pessismistic for column mux + if self.words_per_row >= 2: delay_stages = 8 - elif self.words_per_row == 2: - delay_stages = 6 else: - delay_stages = 4 - + delay_stages = 2 + + #Read ports have a shorter s_en delay. The model is not accurate enough to catch this difference + #on certain sram configs. + if self.port_type == "r": + delay_stages+=2 + return (delay_stages, delay_fanout) def set_sen_wl_delays(self): @@ -227,14 +247,25 @@ class control_logic(design.design): required_delay_rise = self.wl_delay_rise*self.wl_timing_tolerance - (self.sen_delay_rise-previous_delay_chain_delay/2) debug.info(2,"Required delays from chain: fall={}, rise={}".format(required_delay_fall,required_delay_rise)) + #If the fanout is different between rise/fall by this amount. Stage algorithm is made more pessimistic. + WARNING_FANOUT_DIFF = 5 + stages_close = False #The stages need to be equal (or at least a even number of stages with matching rise/fall delays) while True: stages_fall = self.calculate_stages_with_fixed_fanout(required_delay_fall,fanout_fall) stages_rise = self.calculate_stages_with_fixed_fanout(required_delay_rise,fanout_rise) debug.info(1,"Fall stages={}, rise stages={}".format(stages_fall,stages_rise)) + if abs(stages_fall-stages_rise) == 1 and not stages_close: + stages_close = True + safe_fanout_rise = fanout_rise + safe_fanout_fall = fanout_fall + if stages_fall == stages_rise: break - elif abs(stages_fall-stages_rise) == 1: + elif abs(stages_fall-stages_rise) == 1 and WARNING_FANOUT_DIFF < abs(fanout_fall-fanout_rise): + debug.info(1, "Delay chain fanouts between stages are large. Making chain size larger for safety.") + fanout_rise = safe_fanout_rise + fanout_fall = safe_fanout_fall break #There should also be a condition to make sure the fanout does not get too large. #Otherwise, increase the fanout of delay with the most stages, calculate new stages @@ -819,8 +850,8 @@ class control_logic(design.design): def get_delays_to_wl(self): """Get the delay (in delay units) of the clk to a wordline in the bitcell array""" debug.check(self.sram.all_mods_except_control_done, "Cannot calculate sense amp enable delay unless all module have been added.") - stage_efforts = self.determine_wordline_stage_efforts() - clk_to_wl_rise,clk_to_wl_fall = logical_effort.calculate_relative_rise_fall_delays(stage_efforts, self.parasitic_inv_delay) + self.wl_stage_efforts = self.determine_wordline_stage_efforts() + clk_to_wl_rise,clk_to_wl_fall = logical_effort.calculate_relative_rise_fall_delays(self.wl_stage_efforts, self.parasitic_inv_delay) total_delay = clk_to_wl_rise + clk_to_wl_fall debug.info(1, "Clock to wl delay is rise={:.3f}, fall={:.3f}, total={:.3f} in delay units".format(clk_to_wl_rise, clk_to_wl_fall,total_delay)) return clk_to_wl_rise,clk_to_wl_fall @@ -849,8 +880,8 @@ class control_logic(design.design): This does not incorporate the delay of the replica bitline. """ debug.check(self.sram.all_mods_except_control_done, "Cannot calculate sense amp enable delay unless all module have been added.") - stage_efforts = self.determine_sa_enable_stage_efforts() - clk_to_sen_rise, clk_to_sen_fall = logical_effort.calculate_relative_rise_fall_delays(stage_efforts, self.parasitic_inv_delay) + self.sen_stage_efforts = self.determine_sa_enable_stage_efforts() + clk_to_sen_rise, clk_to_sen_fall = logical_effort.calculate_relative_rise_fall_delays(self.sen_stage_efforts, self.parasitic_inv_delay) total_delay = clk_to_sen_rise + clk_to_sen_fall debug.info(1, "Clock to s_en delay is rise={:.3f}, fall={:.3f}, total={:.3f} in delay units".format(clk_to_sen_rise, clk_to_sen_fall,total_delay)) return clk_to_sen_rise, clk_to_sen_fall @@ -881,4 +912,12 @@ class control_logic(design.design): last_stage_rise = stage_effort_list[-1].is_rise return stage_effort_list - + + def get_wl_sen_delays(self): + """Gets a list of the stages and delays in order of their path.""" + if self.sen_stage_efforts == None or self.wl_stage_efforts == None: + debug.error("Model delays not calculated for SRAM.", 1) + wl_delays = logical_effort.calculate_delays(self.wl_stage_efforts, self.parasitic_inv_delay) + sen_delays = logical_effort.calculate_delays(self.sen_stage_efforts, self.parasitic_inv_delay) + return wl_delays, sen_delays + diff --git a/compiler/modules/dff.py b/compiler/modules/dff.py index 19077689..753ae41a 100644 --- a/compiler/modules/dff.py +++ b/compiler/modules/dff.py @@ -21,11 +21,11 @@ class dff(design.design): self.height = dff.height self.pin_map = dff.pin_map - def analytical_power(self, proc, vdd, temp, load): + def analytical_power(self, corner, load): """Returns dynamic and leakage power. Results in nW""" c_eff = self.calculate_effective_capacitance(load) - f = spice["default_event_rate"] - power_dyn = c_eff*vdd*vdd*f + freq = spice["default_event_rate"] + power_dyn = self.calc_dynamic_power(corner, c_eff, freq) power_leak = spice["msflop_leakage"] total_power = self.return_power(power_dyn, power_leak) @@ -39,7 +39,7 @@ class dff(design.design): transition_prob = spice["flop_transition_prob"] return transition_prob*(c_load + c_para) - def analytical_delay(self, slew, load = 0.0): + def analytical_delay(self, corner, slew, load = 0.0): # dont know how to calculate this now, use constant in tech file result = self.return_delay(spice["dff_delay"], spice["dff_slew"]) return result diff --git a/compiler/modules/dff_array.py b/compiler/modules/dff_array.py index 5d728205..9d11b811 100644 --- a/compiler/modules/dff_array.py +++ b/compiler/modules/dff_array.py @@ -154,8 +154,8 @@ class dff_array(design.design): - def analytical_delay(self, slew, load=0.0): - return self.dff.analytical_delay(slew=slew, load=load) + def analytical_delay(self, corner, slew, load=0.0): + return self.dff.analytical_delay(corner, slew=slew, load=load) def get_clk_cin(self): """Return the total capacitance (in relative units) that the clock is loaded by in the dff array""" diff --git a/compiler/modules/dff_buf.py b/compiler/modules/dff_buf.py index 42d37bd1..fa3285ba 100644 --- a/compiler/modules/dff_buf.py +++ b/compiler/modules/dff_buf.py @@ -172,11 +172,11 @@ class dff_buf(design.design): - def analytical_delay(self, slew, load=0.0): + def analytical_delay(self, corner, slew, load=0.0): """ Calculate the analytical delay of DFF-> INV -> INV """ - dff_delay=self.dff.analytical_delay(slew=slew, load=self.inv1.input_load()) - inv1_delay = self.inv1.analytical_delay(slew=dff_delay.slew, load=self.inv2.input_load()) - inv2_delay = self.inv2.analytical_delay(slew=inv1_delay.slew, load=load) + dff_delay=self.dff.analytical_delay(corner, slew=slew, load=self.inv1.input_load()) + inv1_delay = self.inv1.analytical_delay(corner, slew=dff_delay.slew, load=self.inv2.input_load()) + inv2_delay = self.inv2.analytical_delay(corner, slew=inv1_delay.slew, load=load) return dff_delay + inv1_delay + inv2_delay def get_clk_cin(self): diff --git a/compiler/modules/dff_buf_array.py b/compiler/modules/dff_buf_array.py index b179b1c3..56b20dfb 100644 --- a/compiler/modules/dff_buf_array.py +++ b/compiler/modules/dff_buf_array.py @@ -187,7 +187,7 @@ class dff_buf_array(design.design): - def analytical_delay(self, slew, load=0.0): + def analytical_delay(self, corner, slew, load=0.0): return self.dff.analytical_delay(slew=slew, load=load) def get_clk_cin(self): diff --git a/compiler/modules/dff_inv.py b/compiler/modules/dff_inv.py index 436026bb..9b901d3b 100644 --- a/compiler/modules/dff_inv.py +++ b/compiler/modules/dff_inv.py @@ -145,10 +145,10 @@ class dff_inv(design.design): - def analytical_delay(self, slew, load=0.0): + def analytical_delay(self, corner, slew, load=0.0): """ Calculate the analytical delay of DFF-> INV -> INV """ - dff_delay=self.dff.analytical_delay(slew=slew, load=self.inv1.input_load()) - inv1_delay = self.inv1.analytical_delay(slew=dff_delay.slew, load=load) + dff_delay=self.dff.analytical_delay(corner, slew=slew, load=self.inv1.input_load()) + inv1_delay = self.inv1.analytical_delay(corner, slew=dff_delay.slew, load=load) return dff_delay + inv1_delay def get_clk_cin(self): diff --git a/compiler/modules/dff_inv_array.py b/compiler/modules/dff_inv_array.py index 91ccfa92..624e13d0 100644 --- a/compiler/modules/dff_inv_array.py +++ b/compiler/modules/dff_inv_array.py @@ -185,8 +185,8 @@ class dff_inv_array(design.design): - def analytical_delay(self, slew, load=0.0): - return self.dff.analytical_delay(slew=slew, load=load) + def analytical_delay(self, corner, slew, load=0.0): + return self.dff.analytical_delay(corner, slew=slew, load=load) def get_clk_cin(self): """Return the total capacitance (in relative units) that the clock is loaded by in the dff array""" diff --git a/compiler/modules/hierarchical_decoder.py b/compiler/modules/hierarchical_decoder.py index 4bbb6aca..bd17b37e 100644 --- a/compiler/modules/hierarchical_decoder.py +++ b/compiler/modules/hierarchical_decoder.py @@ -594,7 +594,7 @@ class hierarchical_decoder(design.design): rotate=90) - def analytical_delay(self, slew, load = 0.0): + def analytical_delay(self, corner, slew, load = 0.0): # A -> out if self.determine_predecodes(self.num_inputs)[1]==0: pre = self.pre2_4 @@ -602,15 +602,15 @@ class hierarchical_decoder(design.design): else: pre = self.pre3_8 nand = self.nand3 - a_t_out_delay = pre.analytical_delay(slew=slew,load = nand.input_load()) + a_t_out_delay = pre.analytical_delay(corner, slew=slew,load = nand.input_load()) # out -> z - out_t_z_delay = nand.analytical_delay(slew= a_t_out_delay.slew, + out_t_z_delay = nand.analytical_delay(corner, slew= a_t_out_delay.slew, load = self.inv.input_load()) result = a_t_out_delay + out_t_z_delay # Z -> decode_out - z_t_decodeout_delay = self.inv.analytical_delay(slew = out_t_z_delay.slew , load = load) + z_t_decodeout_delay = self.inv.analytical_delay(corner, slew = out_t_z_delay.slew , load = load) result = result + z_t_decodeout_delay return result diff --git a/compiler/modules/hierarchical_predecode2x4.py b/compiler/modules/hierarchical_predecode2x4.py index 83e93f85..f50a43c1 100644 --- a/compiler/modules/hierarchical_predecode2x4.py +++ b/compiler/modules/hierarchical_predecode2x4.py @@ -51,15 +51,15 @@ class hierarchical_predecode2x4(hierarchical_predecode): return combination - def analytical_delay(self, slew, load = 0.0 ): + def analytical_delay(self, corner, slew, load = 0.0 ): # in -> inbar - a_t_b_delay = self.inv.analytical_delay(slew=slew, load=self.nand.input_load()) + a_t_b_delay = self.inv.analytical_delay(corner, slew=slew, load=self.nand.input_load()) # inbar -> z - b_t_z_delay = self.nand.analytical_delay(slew=a_t_b_delay.slew, load=self.inv.input_load()) + b_t_z_delay = self.nand.analytical_delay(corner, slew=a_t_b_delay.slew, load=self.inv.input_load()) # Z -> out - a_t_out_delay = self.inv.analytical_delay(slew=b_t_z_delay.slew, load=load) + a_t_out_delay = self.inv.analytical_delay(corner, slew=b_t_z_delay.slew, load=load) return a_t_b_delay + b_t_z_delay + a_t_out_delay diff --git a/compiler/modules/hierarchical_predecode3x8.py b/compiler/modules/hierarchical_predecode3x8.py index 109e8160..820427c7 100644 --- a/compiler/modules/hierarchical_predecode3x8.py +++ b/compiler/modules/hierarchical_predecode3x8.py @@ -60,15 +60,15 @@ class hierarchical_predecode3x8(hierarchical_predecode): return combination - def analytical_delay(self, slew, load = 0.0 ): + def analytical_delay(self, corner, slew, load = 0.0 ): # A -> Abar - a_t_b_delay = self.inv.analytical_delay(slew=slew, load=self.nand.input_load()) + a_t_b_delay = self.inv.analytical_delay(corner, slew=slew, load=self.nand.input_load()) # Abar -> z - b_t_z_delay = self.nand.analytical_delay(slew=a_t_b_delay.slew, load=self.inv.input_load()) + b_t_z_delay = self.nand.analytical_delay(corner, slew=a_t_b_delay.slew, load=self.inv.input_load()) # Z -> out - a_t_out_delay = self.inv.analytical_delay(slew=b_t_z_delay.slew, load=load) + a_t_out_delay = self.inv.analytical_delay(corner, slew=b_t_z_delay.slew, load=load) return a_t_b_delay + b_t_z_delay + a_t_out_delay diff --git a/compiler/modules/multibank.py b/compiler/modules/multibank.py index 1b9e6194..15882f8b 100644 --- a/compiler/modules/multibank.py +++ b/compiler/modules/multibank.py @@ -816,19 +816,19 @@ class multibank(design.design): offset=in_pin + self.m2m3_via_offset, rotate=90) - def analytical_delay(self, slew, load): + def analytical_delay(self, corner, slew, load): """ return analytical delay of the bank""" - decoder_delay = self.row_decoder.analytical_delay(slew, self.wordline_driver.input_load()) + decoder_delay = self.row_decoder.analytical_delay(corner, slew, self.wordline_driver.input_load()) - word_driver_delay = self.wordline_driver.analytical_delay(decoder_delay.slew, self.bitcell_array.input_load()) + word_driver_delay = self.wordline_driver.analytical_delay(corner, decoder_delay.slew, self.bitcell_array.input_load()) - bitcell_array_delay = self.bitcell_array.analytical_delay(word_driver_delay.slew) + bitcell_array_delay = self.bitcell_array.analytical_delay(corner, word_driver_delay.slew) - bl_t_data_out_delay = self.sense_amp_array.analytical_delay(bitcell_array_delay.slew, + bl_t_data_out_delay = self.sense_amp_array.analytical_delay(corner, bitcell_array_delay.slew, self.bitcell_array.output_load()) # output load of bitcell_array is set to be only small part of bl for sense amp. - data_t_DATA_delay = self.tri_gate_array.analytical_delay(bl_t_data_out_delay.slew, load) + data_t_DATA_delay = self.tri_gate_array.analytical_delay(corner, bl_t_data_out_delay.slew, load) result = decoder_delay + word_driver_delay + bitcell_array_delay + bl_t_data_out_delay + data_t_DATA_delay return result diff --git a/compiler/modules/sense_amp.py b/compiler/modules/sense_amp.py index 8553e42c..0c959685 100644 --- a/compiler/modules/sense_amp.py +++ b/compiler/modules/sense_amp.py @@ -31,14 +31,14 @@ class sense_amp(design.design): bitline_pmos_size = 8 #FIXME: This should be set somewhere and referenced. Probably in tech file. return spice["min_tx_drain_c"]*(bitline_pmos_size/parameter["min_tx_size"])#ff - def analytical_delay(self, slew, load=0.0): + def analytical_delay(self, corner, slew, load=0.0): from tech import spice r = spice["min_tx_r"]/(10) c_para = spice["min_tx_drain_c"] - result = self.cal_delay_with_rc(r = r, c = c_para+load, slew = slew) + result = self.cal_delay_with_rc(corner, r = r, c = c_para+load, slew = slew) return self.return_delay(result.delay, result.slew) - def analytical_power(self, proc, vdd, temp, load): + def analytical_power(self, corner, load): """Returns dynamic and leakage power. Results in nW""" #Power in this module currently not defined. Returns 0 nW (leakage and dynamic). total_power = self.return_power() @@ -48,4 +48,5 @@ class sense_amp(design.design): """Get the relative capacitance of sense amp enable gate cin""" pmos_cin = parameter["sa_en_pmos_size"]/drc("minwidth_tx") nmos_cin = parameter["sa_en_nmos_size"]/drc("minwidth_tx") + #sen is connected to 2 pmos isolation TX and 1 nmos per sense amp. return 2*pmos_cin + nmos_cin \ No newline at end of file diff --git a/compiler/modules/sense_amp_array.py b/compiler/modules/sense_amp_array.py index ebf95c95..47969fd1 100644 --- a/compiler/modules/sense_amp_array.py +++ b/compiler/modules/sense_amp_array.py @@ -136,10 +136,10 @@ class sense_amp_array(design.design): def input_load(self): return self.amp.input_load() - def analytical_delay(self, slew, load=0.0): - return self.amp.analytical_delay(slew=slew, load=load) + def analytical_delay(self, corner, slew, load=0.0): + return self.amp.analytical_delay(corner, slew=slew, load=load) def get_en_cin(self): """Get the relative capacitance of all the sense amp enable connections in the array""" sense_amp_en_cin = self.amp.get_en_cin() - return sense_amp_en_cin * self.words_per_row + return sense_amp_en_cin * self.word_size diff --git a/compiler/modules/single_level_column_mux_array.py b/compiler/modules/single_level_column_mux_array.py index 49293568..57d2cd54 100644 --- a/compiler/modules/single_level_column_mux_array.py +++ b/compiler/modules/single_level_column_mux_array.py @@ -216,13 +216,14 @@ class single_level_column_mux_array(design.design): offset= br_out_offset, rotate=90) - def analytical_delay(self, vdd, slew, load=0.0): + def analytical_delay(self, corner, vdd, slew, load=0.0): from tech import spice, parameter + proc,vdd,temp = corner r = spice["min_tx_r"]/(self.mux.ptx_width/parameter["min_tx_size"]) #Drains of mux transistors make up capacitance. c_para = spice["min_tx_drain_c"]*(self.mux.ptx_width/parameter["min_tx_size"])*self.words_per_row#ff volt_swing = spice["v_threshold_typical"]/vdd - result = self.cal_delay_with_rc(r = r, c = c_para+load, slew = slew, swing = volt_swing) + result = self.cal_delay_with_rc(corner, r = r, c = c_para+load, slew = slew, swing = volt_swing) return self.return_delay(result.delay, result.slew) diff --git a/compiler/modules/tri_gate.py b/compiler/modules/tri_gate.py index da42c7a8..688b3644 100644 --- a/compiler/modules/tri_gate.py +++ b/compiler/modules/tri_gate.py @@ -27,13 +27,13 @@ class tri_gate(design.design): self.height = tri_gate.height self.pin_map = tri_gate.pin_map - def analytical_delay(self, slew, load=0.0): + def analytical_delay(self, corner, slew, load=0.0): from tech import spice r = spice["min_tx_r"] c_para = spice["min_tx_drain_c"] - return self.cal_delay_with_rc(r = r, c = c_para+load, slew = slew) + return self.cal_delay_with_rc(corner, r = r, c = c_para+load, slew = slew) - def analytical_power(self, proc, vdd, temp, load): + def analytical_power(self, corner, load): """Returns dynamic and leakage power. Results in nW""" #Power in this module currently not defined. Returns 0 nW (leakage and dynamic). total_power = self.return_power() diff --git a/compiler/modules/tri_gate_array.py b/compiler/modules/tri_gate_array.py index d56e9c96..c9dee703 100644 --- a/compiler/modules/tri_gate_array.py +++ b/compiler/modules/tri_gate_array.py @@ -116,6 +116,6 @@ class tri_gate_array(design.design): - def analytical_delay(self, slew, load=0.0): - return self.tri.analytical_delay(slew = slew, load = load) + def analytical_delay(self, corner, slew, load=0.0): + return self.tri.analytical_delay(corner, slew = slew, load = load) diff --git a/compiler/modules/wordline_driver.py b/compiler/modules/wordline_driver.py index 830c28de..6ddba9de 100644 --- a/compiler/modules/wordline_driver.py +++ b/compiler/modules/wordline_driver.py @@ -210,12 +210,12 @@ class wordline_driver(design.design): end=wl_offset-vector(self.m1_width,0)) - def analytical_delay(self, slew, load=0): + def analytical_delay(self, corner, slew, load=0): # decode -> net - decode_t_net = self.nand2.analytical_delay(slew, self.inv.input_load()) + decode_t_net = self.nand2.analytical_delay(corner, slew, self.inv.input_load()) # net -> wl - net_t_wl = self.inv.analytical_delay(decode_t_net.slew, load) + net_t_wl = self.inv.analytical_delay(corner, decode_t_net.slew, load) return decode_t_net + net_t_wl diff --git a/compiler/options.py b/compiler/options.py index fc1eb7d1..4d3461e6 100644 --- a/compiler/options.py +++ b/compiler/options.py @@ -71,6 +71,9 @@ class options(optparse.Values): # You can manually specify banks, but it is better to auto-detect it. num_banks = 1 + #Uses the delay chain size in the tech.py file rather automatic sizing. + use_tech_delay_chain_size = False + # These are the default modules that can be over-riden bank_select = "bank_select" bitcell_array = "bitcell_array" diff --git a/compiler/pgates/pand2.py b/compiler/pgates/pand2.py index a5805728..54787282 100644 --- a/compiler/pgates/pand2.py +++ b/compiler/pgates/pand2.py @@ -107,10 +107,10 @@ class pand2(pgate.pgate): - def analytical_delay(self, slew, load=0.0): + def analytical_delay(self, corner, slew, load=0.0): """ Calculate the analytical delay of DFF-> INV -> INV """ - nand_delay = selfnand.analytical_delay(slew=slew, load=self.inv.input_load()) - inv_delay = self.inv.analytical_delay(slew=nand_delay.slew, load=load) + nand_delay = self.nand.analytical_delay(corner, slew=slew, load=self.inv.input_load()) + inv_delay = self.inv.analytical_delay(corner, slew=nand_delay.slew, load=load) return nand_delay + inv_delay def get_stage_efforts(self, external_cout, inp_is_rise=False): diff --git a/compiler/pgates/pbuf.py b/compiler/pgates/pbuf.py index a0b36111..9d73c004 100644 --- a/compiler/pgates/pbuf.py +++ b/compiler/pgates/pbuf.py @@ -110,10 +110,10 @@ class pbuf(pgate.pgate): - def analytical_delay(self, slew, load=0.0): + def analytical_delay(self, corner, slew, load=0.0): """ Calculate the analytical delay of DFF-> INV -> INV """ - inv1_delay = self.inv1.analytical_delay(slew=slew, load=self.inv2.input_load()) - inv2_delay = self.inv2.analytical_delay(slew=inv1_delay.slew, load=load) + inv1_delay = self.inv1.analytical_delay(corner, slew=slew, load=self.inv2.input_load()) + inv2_delay = self.inv2.analytical_delay(corner, slew=inv1_delay.slew, load=load) return inv1_delay + inv2_delay def get_stage_efforts(self, external_cout, inp_is_rise=False): diff --git a/compiler/pgates/pdriver.py b/compiler/pgates/pdriver.py index 3a0e4e78..daf4d334 100644 --- a/compiler/pgates/pdriver.py +++ b/compiler/pgates/pdriver.py @@ -172,7 +172,7 @@ class pdriver(pgate.pgate): def input_load(self): return self.inv_list[0].input_load() - def analytical_delay(self, slew, load=0.0): + def analytical_delay(self, corner, slew, load=0.0): """Calculate the analytical delay of INV1 -> ... -> INVn""" cout_list = [] @@ -184,7 +184,7 @@ class pdriver(pgate.pgate): delays = [] for inv,cout in zip(self.inv_list,cout_list): - delays.append(inv.analytical_delay(slew=input_slew, load=cout)) + delays.append(inv.analytical_delay(corner, slew=input_slew, load=cout)) input_slew = delays[-1].slew delay = delays[0] @@ -196,17 +196,16 @@ class pdriver(pgate.pgate): def get_stage_efforts(self, external_cout, inp_is_rise=False): """Get the stage efforts of the A -> Z path""" - - cout_list = {} + cout_list = [] for prev_inv,inv in zip(self.inv_list, self.inv_list[1:]): - cout_list[prev_inv]=inv.get_cin() - - cout_list[self.inv_list[-1]]=external_cout + cout_list.append(inv.get_cin()) + + cout_list.append(external_cout) stage_effort_list = [] last_inp_is_rise = inp_is_rise - for inv in self.inv_list: - stage = inv.get_stage_effort(cout_list[inv], last_inp_is_rise) + for inv,cout in zip(self.inv_list,cout_list): + stage = inv.get_stage_effort(cout, last_inp_is_rise) stage_effort_list.append(stage) last_inp_is_rise = stage.is_rise diff --git a/compiler/pgates/pinv.py b/compiler/pgates/pinv.py index aa16ab54..f00e9af7 100644 --- a/compiler/pgates/pinv.py +++ b/compiler/pgates/pinv.py @@ -261,16 +261,16 @@ class pinv(pgate.pgate): def input_load(self): return ((self.nmos_size+self.pmos_size)/parameter["min_tx_size"])*spice["min_tx_gate_c"] - def analytical_delay(self, slew, load=0.0): + def analytical_delay(self, corner, slew, load=0.0): r = spice["min_tx_r"]/(self.nmos_size/parameter["min_tx_size"]) c_para = spice["min_tx_drain_c"]*(self.nmos_size/parameter["min_tx_size"])#ff - return self.cal_delay_with_rc(r = r, c = c_para+load, slew = slew) + return self.cal_delay_with_rc(corner, r = r, c = c_para+load, slew = slew) - def analytical_power(self, proc, vdd, temp, load): + def analytical_power(self, corner, load): """Returns dynamic and leakage power. Results in nW""" c_eff = self.calculate_effective_capacitance(load) freq = spice["default_event_rate"] - power_dyn = c_eff*vdd*vdd*freq + power_dyn = self.calc_dynamic_power(corner, c_eff, freq) power_leak = spice["inv_leakage"] total_power = self.return_power(power_dyn, power_leak) @@ -292,4 +292,4 @@ class pinv(pgate.pgate): Optional is_rise refers to the input direction rise/fall. Input inverted by this stage. """ parasitic_delay = 1 - return logical_effort.logical_effort(self.size, self.get_cin(), cout, parasitic_delay, not inp_is_rise) + return logical_effort.logical_effort(self.name, self.size, self.get_cin(), cout, parasitic_delay, not inp_is_rise) diff --git a/compiler/pgates/pinvbuf.py b/compiler/pgates/pinvbuf.py index e950bd3f..06936895 100644 --- a/compiler/pgates/pinvbuf.py +++ b/compiler/pgates/pinvbuf.py @@ -177,10 +177,10 @@ class pinvbuf(design.design): - def analytical_delay(self, slew, load=0.0): + def analytical_delay(self, corner, slew, load=0.0): """ Calculate the analytical delay of DFF-> INV -> INV """ - inv1_delay = self.inv1.analytical_delay(slew=slew, load=self.inv2.input_load()) - inv2_delay = self.inv2.analytical_delay(slew=inv1_delay.slew, load=load) + inv1_delay = self.inv1.analytical_delay(corner, slew=slew, load=self.inv2.input_load()) + inv2_delay = self.inv2.analytical_delay(corner, slew=inv1_delay.slew, load=load) return inv1_delay + inv2_delay def determine_clk_buf_stage_efforts(self, external_cout, inp_is_rise=False): diff --git a/compiler/pgates/pnand2.py b/compiler/pgates/pnand2.py index d196bf15..95a9bc28 100644 --- a/compiler/pgates/pnand2.py +++ b/compiler/pgates/pnand2.py @@ -227,16 +227,16 @@ class pnand2(pgate.pgate): def input_load(self): return ((self.nmos_size+self.pmos_size)/parameter["min_tx_size"])*spice["min_tx_gate_c"] - def analytical_delay(self, slew, load=0.0): + def analytical_delay(self, corner, slew, load=0.0): r = spice["min_tx_r"]/(self.nmos_size/parameter["min_tx_size"]) c_para = spice["min_tx_drain_c"]*(self.nmos_size/parameter["min_tx_size"])#ff - return self.cal_delay_with_rc(r = r, c = c_para+load, slew = slew) + return self.cal_delay_with_rc(corner, r = r, c = c_para+load, slew = slew) - def analytical_power(self, proc, vdd, temp, load): + def analytical_power(self, corner, load): """Returns dynamic and leakage power. Results in nW""" c_eff = self.calculate_effective_capacitance(load) freq = spice["default_event_rate"] - power_dyn = c_eff*vdd*vdd*freq + power_dyn = self.calc_dynamic_power(corner, c_eff, freq) power_leak = spice["nand2_leakage"] total_power = self.return_power(power_dyn, power_leak) @@ -258,4 +258,4 @@ class pnand2(pgate.pgate): Optional is_rise refers to the input direction rise/fall. Input inverted by this stage. """ parasitic_delay = 2 - return logical_effort.logical_effort(self.size, self.get_cin(), cout, parasitic_delay, not inp_is_rise) + return logical_effort.logical_effort(self.name, self.size, self.get_cin(), cout, parasitic_delay, not inp_is_rise) diff --git a/compiler/pgates/pnand3.py b/compiler/pgates/pnand3.py index 29ae98c0..d0c37b55 100644 --- a/compiler/pgates/pnand3.py +++ b/compiler/pgates/pnand3.py @@ -4,6 +4,7 @@ import debug from tech import drc, parameter, spice from vector import vector from globals import OPTS +import logical_effort from sram_factory import factory class pnand3(pgate.pgate): @@ -239,16 +240,16 @@ class pnand3(pgate.pgate): def input_load(self): return ((self.nmos_size+self.pmos_size)/parameter["min_tx_size"])*spice["min_tx_gate_c"] - def analytical_delay(self, slew, load=0.0): + def analytical_delay(self, corner, slew, load=0.0): r = spice["min_tx_r"]/(self.nmos_size/parameter["min_tx_size"]) c_para = spice["min_tx_drain_c"]*(self.nmos_size/parameter["min_tx_size"])#ff - return self.cal_delay_with_rc(r = r, c = c_para+load, slew = slew) + return self.cal_delay_with_rc(corner, r = r, c = c_para+load, slew = slew) - def analytical_power(self, proc, vdd, temp, load): + def analytical_power(self, corner, load): """Returns dynamic and leakage power. Results in nW""" c_eff = self.calculate_effective_capacitance(load) freq = spice["default_event_rate"] - power_dyn = c_eff*vdd*vdd*freq + power_dyn = self.calc_dynamic_power(corner, c_eff, freq) power_leak = spice["nand3_leakage"] total_power = self.return_power(power_dyn, power_leak) @@ -270,4 +271,4 @@ class pnand3(pgate.pgate): Optional is_rise refers to the input direction rise/fall. Input inverted by this stage. """ parasitic_delay = 3 - return logical_effort.logical_effort(self.size, self.get_cin(), cout, parasitic_delay, not inp_is_rise) + return logical_effort.logical_effort(self.name, self.size, self.get_cin(), cout, parasitic_delay, not inp_is_rise) diff --git a/compiler/pgates/pnor2.py b/compiler/pgates/pnor2.py index d1be51f3..8a5c80d4 100644 --- a/compiler/pgates/pnor2.py +++ b/compiler/pgates/pnor2.py @@ -212,16 +212,16 @@ class pnor2(pgate.pgate): def input_load(self): return ((self.nmos_size+self.pmos_size)/parameter["min_tx_size"])*spice["min_tx_gate_c"] - def analytical_delay(self, slew, load=0.0): + def analytical_delay(self, corner, slew, load=0.0): r = spice["min_tx_r"]/(self.nmos_size/parameter["min_tx_size"]) c_para = spice["min_tx_drain_c"]*(self.nmos_size/parameter["min_tx_size"])#ff - return self.cal_delay_with_rc(r = r, c = c_para+load, slew = slew) + return self.cal_delay_with_rc(corner, r = r, c = c_para+load, slew = slew) - def analytical_power(self, proc, vdd, temp, load): + def analytical_power(self, corner, load): """Returns dynamic and leakage power. Results in nW""" c_eff = self.calculate_effective_capacitance(load) freq = spice["default_event_rate"] - power_dyn = c_eff*vdd*vdd*freq + power_dyn = self.calc_dynamic_power(corner, c_eff, freq) power_leak = spice["nor2_leakage"] total_power = self.return_power(power_dyn, power_leak) diff --git a/compiler/profile_stats.py b/compiler/profile_stats.py deleted file mode 100755 index d3c33801..00000000 --- a/compiler/profile_stats.py +++ /dev/null @@ -1,5 +0,0 @@ -import pstats -p = pstats.Stats('profile.dat') -p.strip_dirs() -p.sort_stats('cumulative') -p.print_stats(50) diff --git a/compiler/sram_base.py b/compiler/sram_base.py index 61d3639d..611900e4 100644 --- a/compiler/sram_base.py +++ b/compiler/sram_base.py @@ -499,9 +499,9 @@ class sram_base(design, verilog, lef): sp.close() - def analytical_delay(self, vdd, slew,load): + def analytical_delay(self, corner, slew,load): """ LH and HL are the same in analytical model. """ - return self.bank.analytical_delay(vdd,slew,load) + return self.bank.analytical_delay(corner,slew,load) def determine_wordline_stage_efforts(self, inp_is_rise=True): """Get the all the stage efforts for each stage in the path from clk_buf to a wordline""" diff --git a/compiler/sram_config.py b/compiler/sram_config.py index 24e3cbc9..5edf9282 100644 --- a/compiler/sram_config.py +++ b/compiler/sram_config.py @@ -7,13 +7,13 @@ from sram_factory import factory class sram_config: """ This is a structure that is used to hold the SRAM configuration options. """ - def __init__(self, word_size, num_words, num_banks=1): + def __init__(self, word_size, num_words, num_banks=1, words_per_row=None): self.word_size = word_size self.num_words = num_words self.num_banks = num_banks # This will get over-written when we determine the organization - self.words_per_row = None + self.words_per_row = words_per_row self.compute_sizes() diff --git a/compiler/tests/04_pbitcell_test.py b/compiler/tests/04_pbitcell_test.py index 96e6bba8..c78b3284 100755 --- a/compiler/tests/04_pbitcell_test.py +++ b/compiler/tests/04_pbitcell_test.py @@ -26,7 +26,7 @@ class pbitcell_test(openram_test): debug.info(2, "Bitcell with 1 of each port: read/write, write, and read") tx = pbitcell(name="pbc") self.local_check(tx) - + OPTS.num_rw_ports=0 OPTS.num_w_ports=1 OPTS.num_r_ports=1 diff --git a/compiler/tests/16_control_logic_test.py b/compiler/tests/16_control_logic_test.py index 91ad0500..e0545af4 100755 --- a/compiler/tests/16_control_logic_test.py +++ b/compiler/tests/16_control_logic_test.py @@ -36,17 +36,21 @@ class control_logic_test(openram_test): # Check port specific control logic OPTS.num_rw_ports = 1 - OPTS.num_w_ports = 1 - OPTS.num_r_ports = 1 + OPTS.num_w_ports = 0 + OPTS.num_r_ports = 0 debug.info(1, "Testing sample for control_logic for multiport, only write control logic") a = control_logic.control_logic(num_rows=128, words_per_row=1, word_size=8, port_type="rw") self.local_check(a) + OPTS.num_rw_ports = 0 + OPTS.num_w_ports = 1 debug.info(1, "Testing sample for control_logic for multiport, only write control logic") a = control_logic.control_logic(num_rows=128, words_per_row=1, word_size=8, port_type="w") self.local_check(a) + OPTS.num_w_ports = 0 + OPTS.num_r_ports = 1 debug.info(1, "Testing sample for control_logic for multiport, only read control logic") a = control_logic.control_logic(num_rows=128, words_per_row=1, word_size=8, port_type="r") self.local_check(a) diff --git a/compiler/tests/20_sram_1bank_2mux_1w_1r_test.py b/compiler/tests/20_sram_1bank_2mux_1w_1r_test.py new file mode 100755 index 00000000..2954ffbc --- /dev/null +++ b/compiler/tests/20_sram_1bank_2mux_1w_1r_test.py @@ -0,0 +1,51 @@ +#!/usr/bin/env python3 +""" +Run a regression test on a 1 bank SRAM +""" + +import unittest +from testutils import header,openram_test +import sys,os +sys.path.append(os.path.join(sys.path[0],"..")) +import globals +from globals import OPTS +import debug + +#@unittest.skip("SKIPPING 20_psram_1bank_2mux_1w_1r_test, odd supply routing error") +class psram_1bank_2mux_1w_1r_test(openram_test): + + def runTest(self): + globals.init_openram("config_20_{0}".format(OPTS.tech_name)) + from sram import sram + from sram_config import sram_config + OPTS.bitcell = "bitcell_1w_1r" + OPTS.replica_bitcell="replica_bitcell_1w_1r" + + OPTS.num_rw_ports = 0 + OPTS.num_w_ports = 1 + OPTS.num_r_ports = 1 + + c = sram_config(word_size=4, + num_words=32, + num_banks=1) + c.num_words=32 + c.words_per_row=2 + c.recompute_sizes() + debug.info(1, "Layout test for {}rw,{}r,{}w psram with {} bit words, {} words, {} words per row, {} banks".format(OPTS.num_rw_ports, + OPTS.num_r_ports, + OPTS.num_w_ports, + c.word_size, + c.num_words, + c.words_per_row, + c.num_banks)) + a = sram(c, "sram") + self.local_check(a, final_verification=True) + + globals.end_openram() + +# run the test from the command line +if __name__ == "__main__": + (OPTS, args) = globals.parse_args() + del sys.argv[1:] + header(__file__, OPTS.tech_name) + unittest.main() diff --git a/compiler/tests/21_hspice_delay_test.py b/compiler/tests/21_hspice_delay_test.py index d412d42f..fa7fc35f 100755 --- a/compiler/tests/21_hspice_delay_test.py +++ b/compiler/tests/21_hspice_delay_test.py @@ -23,7 +23,7 @@ class timing_sram_test(openram_test): from importlib import reload import characterizer reload(characterizer) - from characterizer import delay, bitline_delay + from characterizer import delay from sram import sram from sram_config import sram_config c = sram_config(word_size=1, @@ -43,37 +43,44 @@ class timing_sram_test(openram_test): corner = (OPTS.process_corners[0], OPTS.supply_voltages[0], OPTS.temperatures[0]) d = delay(s.s, tempspice, corner) - bl = bitline_delay(s.s, tempspice, corner) import tech loads = [tech.spice["msflop_in_cap"]*4] slews = [tech.spice["rise_time"]*2] data, port_data = d.analyze(probe_address, probe_data, slews, loads) - #bitline_swing = bl.analyze(probe_address, probe_data, slews, loads) #Combine info about port into all data data.update(port_data[0]) - + if OPTS.tech_name == "freepdk45": - golden_data = {'delay_hl': [0.2152017], - 'delay_lh': [0.2152017], - 'leakage_power': 0.0022907, - 'min_period': 0.488, - 'read0_power': [0.47437749999999995], - 'read1_power': [0.45026109999999997], - 'slew_hl': [0.0846786], - 'slew_lh': [0.0846786], - 'write0_power': [0.40809259999999997], - 'write1_power': [0.4078904]} + golden_data = {'delay_bl': [0.1980959], + 'delay_br': [0.1946091], + 'delay_hl': [0.2121267], + 'delay_lh': [0.2121267], + 'leakage_power': 0.0023761999999999998, + 'min_period': 0.43, + 'read0_power': [0.5139368], + 'read1_power': [0.48940979999999995], + 'slew_hl': [0.0516745], + 'slew_lh': [0.0516745], + 'volt_bl': [0.5374525], + 'volt_br': [1.1058], + 'write0_power': [0.46267169999999996], + 'write1_power': [0.4670826]} elif OPTS.tech_name == "scn4m_subm": - golden_data = {'delay_hl': [1.4333000000000002], - 'delay_lh': [1.4333000000000002], - 'leakage_power': 0.0271847, - 'min_period': 2.891, - 'read0_power': [15.714200000000002], - 'read1_power': [14.9848], - 'slew_hl': [0.6819276999999999], - 'slew_lh': [0.6819276999999999], - 'write0_power': [13.9658], - 'write1_power': [14.8422]} + golden_data = {'delay_bl': [1.1029], + 'delay_br': [0.9656455999999999], + 'delay_hl': [1.288], + 'delay_lh': [1.288], + 'leakage_power': 0.0273896, + 'min_period': 2.578, + 'read0_power': [16.9996], + 'read1_power': [16.2616], + 'slew_hl': [0.47891700000000004], + 'slew_lh': [0.47891700000000004], + 'volt_bl': [4.2155], + 'volt_br': [5.8142], + 'write0_power': [16.0656], + 'write1_power': [16.2616]} + else: self.assertTrue(False) # other techs fail # Check if no too many or too few results diff --git a/compiler/tests/21_ngspice_delay_test.py b/compiler/tests/21_ngspice_delay_test.py index aac42fa6..5af44e69 100755 --- a/compiler/tests/21_ngspice_delay_test.py +++ b/compiler/tests/21_ngspice_delay_test.py @@ -51,27 +51,36 @@ class timing_sram_test(openram_test): data.update(port_data[0]) if OPTS.tech_name == "freepdk45": - golden_data = {'delay_hl': [0.221699], - 'delay_lh': [0.221699], - 'leakage_power': 0.001467648, - 'min_period': 0.605, - 'read0_power': [0.3879335], - 'read1_power': [0.3662724], - 'slew_hl': [0.08562444999999999], - 'slew_lh': [0.08562444999999999], - 'write0_power': [0.3362456], - 'write1_power': [0.3372035]} + golden_data = {'delay_bl': [0.2003652], + 'delay_br': [0.198698], + 'delay_hl': [0.2108836], + 'delay_lh': [0.2108836], + 'leakage_power': 0.001564799, + 'min_period': 0.508, + 'read0_power': [0.43916689999999997], + 'read1_power': [0.4198608], + 'slew_hl': [0.0455126], + 'slew_lh': [0.0455126], + 'volt_bl': [0.6472883], + 'volt_br': [1.114024], + 'write0_power': [0.40681890000000004], + 'write1_power': [0.4198608]} elif OPTS.tech_name == "scn4m_subm": - golden_data = {'delay_hl': [1.7951730000000001], - 'delay_lh': [1.7951730000000001], - 'leakage_power': 0.001669513, - 'min_period': 3.594, - 'read0_power': [17.03022], - 'read1_power': [16.55897], - 'slew_hl': [0.7079951], - 'slew_lh': [0.7079951], - 'write0_power': [15.16726], - 'write1_power': [16.13527]} + golden_data = {'delay_bl': [1.3937359999999999], + 'delay_br': [1.2596429999999998], + 'delay_hl': [1.5747600000000002], + 'delay_lh': [1.5747600000000002], + 'leakage_power': 0.00195795, + 'min_period': 3.281, + 'read0_power': [14.92874], + 'read1_power': [14.369810000000001], + 'slew_hl': [0.49631959999999997], + 'slew_lh': [0.49631959999999997], + 'volt_bl': [4.132618], + 'volt_br': [5.573099], + 'write0_power': [13.79953], + 'write1_power': [14.369810000000001]} + else: self.assertTrue(False) # other techs fail diff --git a/compiler/tests/23_lib_sram_model_corners_test.py b/compiler/tests/23_lib_sram_model_corners_test.py new file mode 100755 index 00000000..431555bc --- /dev/null +++ b/compiler/tests/23_lib_sram_model_corners_test.py @@ -0,0 +1,69 @@ +#!/usr/bin/env python3 +""" +Check the .lib file for an SRAM +""" + +import unittest +from testutils import header,openram_test +import sys,os,re +sys.path.append(os.path.join(sys.path[0],"..")) +import globals +from globals import OPTS +import debug + +class model_corners_lib_test(openram_test): + + def runTest(self): + globals.init_openram("config_20_{0}".format(OPTS.tech_name)) + + from characterizer import lib + from sram import sram + from sram_config import sram_config + c = sram_config(word_size=2, + num_words=16, + num_banks=1) + c.words_per_row=1 + c.recompute_sizes() + debug.info(1, "Testing analytical timing for sample 2 bit, 16 words SRAM with 1 bank") + s = sram(c, "sram_2_16_1_{0}".format(OPTS.tech_name)) + tempspice = OPTS.openram_temp + "temp.sp" + s.sp_write(tempspice) + + #Set the corners. Lib will create a power set of the lists. + if OPTS.tech_name == "scn4m_subm": + OPTS.process_corners = ["TT", "SS", "FF"] + OPTS.supply_voltages = [5.0] + OPTS.temperatures = [25] + elif OPTS.tech_name == "freepdk45": + OPTS.process_corners = ["TT", "SS", "FF"] + OPTS.supply_voltages = [1.0] + OPTS.temperatures = [25] + + lib(out_dir=OPTS.openram_temp, sram=s.s, sp_file=tempspice, use_model=True) + + # get all of the .lib files generated + files = os.listdir(OPTS.openram_temp) + nametest = re.compile("\.lib$", re.IGNORECASE) + lib_files = filter(nametest.search, files) + + # and compare them with the golden model + for filename in lib_files: + newname = filename.replace(".lib","_analytical.lib") + libname = "{0}/{1}".format(OPTS.openram_temp,filename) + golden = "{0}/golden/{1}".format(os.path.dirname(os.path.realpath(__file__)),newname) + self.assertTrue(self.isapproxdiff(libname,golden,0.15)) + + globals.end_openram() + +# run the test from the command line +if __name__ == "__main__": + (OPTS, args) = globals.parse_args() + del sys.argv[1:] + header(__file__, OPTS.tech_name) + unittest.main() + + + + + + diff --git a/compiler/tests/28_delay_model_test.py b/compiler/tests/28_delay_model_test.py new file mode 100755 index 00000000..a02a42e9 --- /dev/null +++ b/compiler/tests/28_delay_model_test.py @@ -0,0 +1,64 @@ +#!/usr/bin/env python3 +""" +Run a regression test on various srams +""" + +import unittest +from testutils import header,openram_test +import sys,os +sys.path.append(os.path.join(sys.path[0],"..")) +import globals +from globals import OPTS +import debug + +class delay_model_test(openram_test): + + def runTest(self): + globals.init_openram("config_20_{0}".format(OPTS.tech_name)) + OPTS.spice_name="hspice" + OPTS.analytical_delay = False + OPTS.netlist_only = True + OPTS.trim_netlist = False + debug.info(1, "Trimming disabled for this test. Simulation could be slow.") + + # This is a hack to reload the characterizer __init__ with the spice version + from importlib import reload + import characterizer + reload(characterizer) + + from characterizer import model_check + from sram import sram + from sram_config import sram_config + c = sram_config(word_size=4, + num_words=16, + num_banks=1) + c.words_per_row=1 + c.recompute_sizes() + debug.info(1, "Testing timing for sample 1bit, 16words SRAM with 1 bank") + s = sram(c, name="sram1") + + tempspice = OPTS.openram_temp + "temp.sp" + s.sp_write(tempspice) + + probe_address = "1" * s.s.addr_size + probe_data = s.s.word_size - 1 + debug.info(1, "Probe address {0} probe data bit {1}".format(probe_address, probe_data)) + + corner = (OPTS.process_corners[0], OPTS.supply_voltages[0], OPTS.temperatures[0]) + mc = model_check(s.s, tempspice, corner) + import tech + loads = [tech.spice["msflop_in_cap"]*4] + slews = [tech.spice["rise_time"]*2] + sram_data = mc.analyze(probe_address, probe_data, slews, loads) + #Combine info about port into all data + + #debug.info(1,"Data:\n{}".format(wl_data)) + + globals.end_openram() + +# run the test from the command line +if __name__ == "__main__": + (OPTS, args) = globals.parse_args() + del sys.argv[1:] + header(__file__, OPTS.tech_name) + unittest.main() diff --git a/compiler/tests/golden/sram_2_16_1_freepdk45_FF_1p0V_25C_analytical.lib b/compiler/tests/golden/sram_2_16_1_freepdk45_FF_1p0V_25C_analytical.lib new file mode 100644 index 00000000..88b54eca --- /dev/null +++ b/compiler/tests/golden/sram_2_16_1_freepdk45_FF_1p0V_25C_analytical.lib @@ -0,0 +1,321 @@ +library (sram_2_16_1_freepdk45_FF_1p0V_25C_lib){ + delay_model : "table_lookup"; + time_unit : "1ns" ; + voltage_unit : "1v" ; + current_unit : "1mA" ; + resistance_unit : "1kohm" ; + capacitive_load_unit(1 ,fF) ; + leakage_power_unit : "1mW" ; + pulling_resistance_unit :"1kohm" ; + operating_conditions(OC){ + process : 1.0 ; + voltage : 1.0 ; + temperature : 25; + } + + input_threshold_pct_fall : 50.0 ; + output_threshold_pct_fall : 50.0 ; + input_threshold_pct_rise : 50.0 ; + output_threshold_pct_rise : 50.0 ; + slew_lower_threshold_pct_fall : 10.0 ; + slew_upper_threshold_pct_fall : 90.0 ; + slew_lower_threshold_pct_rise : 10.0 ; + slew_upper_threshold_pct_rise : 90.0 ; + + nom_voltage : 1.0; + nom_temperature : 25; + nom_process : 1.0; + default_cell_leakage_power : 0.0 ; + default_leakage_power_density : 0.0 ; + default_input_pin_cap : 1.0 ; + default_inout_pin_cap : 1.0 ; + default_output_pin_cap : 0.0 ; + default_max_transition : 0.5 ; + default_fanout_load : 1.0 ; + default_max_fanout : 4.0 ; + default_connection_class : universal ; + + lu_table_template(CELL_TABLE){ + variable_1 : input_net_transition; + variable_2 : total_output_net_capacitance; + index_1("0.00125, 0.005, 0.04"); + index_2("0.052275, 0.2091, 1.6728"); + } + + lu_table_template(CONSTRAINT_TABLE){ + variable_1 : related_pin_transition; + variable_2 : constrained_pin_transition; + index_1("0.00125, 0.005, 0.04"); + index_2("0.00125, 0.005, 0.04"); + } + + default_operating_conditions : OC; + + + type (DATA){ + base_type : array; + data_type : bit; + bit_width : 2; + bit_from : 0; + bit_to : 1; + } + + type (ADDR){ + base_type : array; + data_type : bit; + bit_width : 4; + bit_from : 0; + bit_to : 3; + } + +cell (sram_2_16_1_freepdk45){ + memory(){ + type : ram; + address_width : 4; + word_width : 2; + } + interface_timing : true; + dont_use : true; + map_only : true; + dont_touch : true; + area : 1124.88; + + leakage_power () { + when : "CSb0"; + value : 0.000167; + } + cell_leakage_power : 0; + bus(DIN0){ + bus_type : DATA; + direction : input; + capacitance : 0.2091; + memory_write(){ + address : ADDR0; + clocked_on : clk0; + } + pin(DIN0[1:0]){ + timing(){ + timing_type : setup_rising; + related_pin : "clk0"; + rise_constraint(CONSTRAINT_TABLE) { + values("0.009, 0.009, 0.009",\ + "0.009, 0.009, 0.009",\ + "0.009, 0.009, 0.009"); + } + fall_constraint(CONSTRAINT_TABLE) { + values("0.009, 0.009, 0.009",\ + "0.009, 0.009, 0.009",\ + "0.009, 0.009, 0.009"); + } + } + timing(){ + timing_type : hold_rising; + related_pin : "clk0"; + rise_constraint(CONSTRAINT_TABLE) { + values("0.001, 0.001, 0.001",\ + "0.001, 0.001, 0.001",\ + "0.001, 0.001, 0.001"); + } + fall_constraint(CONSTRAINT_TABLE) { + values("0.001, 0.001, 0.001",\ + "0.001, 0.001, 0.001",\ + "0.001, 0.001, 0.001"); + } + } + } + } + bus(DOUT0){ + bus_type : DATA; + direction : output; + max_capacitance : 1.6728; + min_capacitance : 0.052275; + memory_read(){ + address : ADDR0; + } + pin(DOUT0[1:0]){ + timing(){ + timing_sense : non_unate; + related_pin : "clk0"; + timing_type : falling_edge; + cell_rise(CELL_TABLE) { + values("0.088, 0.088, 0.088",\ + "0.088, 0.088, 0.088",\ + "0.088, 0.088, 0.088"); + } + cell_fall(CELL_TABLE) { + values("0.088, 0.088, 0.088",\ + "0.088, 0.088, 0.088",\ + "0.088, 0.088, 0.088"); + } + rise_transition(CELL_TABLE) { + values("0.001, 0.001, 0.001",\ + "0.001, 0.001, 0.001",\ + "0.001, 0.001, 0.001"); + } + fall_transition(CELL_TABLE) { + values("0.001, 0.001, 0.001",\ + "0.001, 0.001, 0.001",\ + "0.001, 0.001, 0.001"); + } + } + } + } + + bus(ADDR0){ + bus_type : ADDR; + direction : input; + capacitance : 0.2091; + max_transition : 0.04; + pin(ADDR0[3:0]){ + timing(){ + timing_type : setup_rising; + related_pin : "clk0"; + rise_constraint(CONSTRAINT_TABLE) { + values("0.009, 0.009, 0.009",\ + "0.009, 0.009, 0.009",\ + "0.009, 0.009, 0.009"); + } + fall_constraint(CONSTRAINT_TABLE) { + values("0.009, 0.009, 0.009",\ + "0.009, 0.009, 0.009",\ + "0.009, 0.009, 0.009"); + } + } + timing(){ + timing_type : hold_rising; + related_pin : "clk0"; + rise_constraint(CONSTRAINT_TABLE) { + values("0.001, 0.001, 0.001",\ + "0.001, 0.001, 0.001",\ + "0.001, 0.001, 0.001"); + } + fall_constraint(CONSTRAINT_TABLE) { + values("0.001, 0.001, 0.001",\ + "0.001, 0.001, 0.001",\ + "0.001, 0.001, 0.001"); + } + } + } + } + + pin(CSb0){ + direction : input; + capacitance : 0.2091; + timing(){ + timing_type : setup_rising; + related_pin : "clk0"; + rise_constraint(CONSTRAINT_TABLE) { + values("0.009, 0.009, 0.009",\ + "0.009, 0.009, 0.009",\ + "0.009, 0.009, 0.009"); + } + fall_constraint(CONSTRAINT_TABLE) { + values("0.009, 0.009, 0.009",\ + "0.009, 0.009, 0.009",\ + "0.009, 0.009, 0.009"); + } + } + timing(){ + timing_type : hold_rising; + related_pin : "clk0"; + rise_constraint(CONSTRAINT_TABLE) { + values("0.001, 0.001, 0.001",\ + "0.001, 0.001, 0.001",\ + "0.001, 0.001, 0.001"); + } + fall_constraint(CONSTRAINT_TABLE) { + values("0.001, 0.001, 0.001",\ + "0.001, 0.001, 0.001",\ + "0.001, 0.001, 0.001"); + } + } + } + + pin(WEb0){ + direction : input; + capacitance : 0.2091; + timing(){ + timing_type : setup_rising; + related_pin : "clk0"; + rise_constraint(CONSTRAINT_TABLE) { + values("0.009, 0.009, 0.009",\ + "0.009, 0.009, 0.009",\ + "0.009, 0.009, 0.009"); + } + fall_constraint(CONSTRAINT_TABLE) { + values("0.009, 0.009, 0.009",\ + "0.009, 0.009, 0.009",\ + "0.009, 0.009, 0.009"); + } + } + timing(){ + timing_type : hold_rising; + related_pin : "clk0"; + rise_constraint(CONSTRAINT_TABLE) { + values("0.001, 0.001, 0.001",\ + "0.001, 0.001, 0.001",\ + "0.001, 0.001, 0.001"); + } + fall_constraint(CONSTRAINT_TABLE) { + values("0.001, 0.001, 0.001",\ + "0.001, 0.001, 0.001",\ + "0.001, 0.001, 0.001"); + } + } + } + + pin(clk0){ + clock : true; + direction : input; + capacitance : 0.2091; + internal_power(){ + when : "!CSb0 & clk0 & !WEb0"; + rise_power(scalar){ + values("0.033101244168888884"); + } + fall_power(scalar){ + values("0.033101244168888884"); + } + } + internal_power(){ + when : "!CSb0 & !clk0 & WEb0"; + rise_power(scalar){ + values("0.033101244168888884"); + } + fall_power(scalar){ + values("0.033101244168888884"); + } + } + internal_power(){ + when : "CSb0"; + rise_power(scalar){ + values("0"); + } + fall_power(scalar){ + values("0"); + } + } + timing(){ + timing_type :"min_pulse_width"; + related_pin : clk0; + rise_constraint(scalar) { + values("0.009"); + } + fall_constraint(scalar) { + values("0.009"); + } + } + timing(){ + timing_type :"minimum_period"; + related_pin : clk0; + rise_constraint(scalar) { + values("0.018"); + } + fall_constraint(scalar) { + values("0.018"); + } + } + } + + } +} diff --git a/compiler/tests/golden/sram_2_16_1_freepdk45_SS_1p0V_25C_analytical.lib b/compiler/tests/golden/sram_2_16_1_freepdk45_SS_1p0V_25C_analytical.lib new file mode 100644 index 00000000..e78fe8d3 --- /dev/null +++ b/compiler/tests/golden/sram_2_16_1_freepdk45_SS_1p0V_25C_analytical.lib @@ -0,0 +1,321 @@ +library (sram_2_16_1_freepdk45_SS_1p0V_25C_lib){ + delay_model : "table_lookup"; + time_unit : "1ns" ; + voltage_unit : "1v" ; + current_unit : "1mA" ; + resistance_unit : "1kohm" ; + capacitive_load_unit(1 ,fF) ; + leakage_power_unit : "1mW" ; + pulling_resistance_unit :"1kohm" ; + operating_conditions(OC){ + process : 1.0 ; + voltage : 1.0 ; + temperature : 25; + } + + input_threshold_pct_fall : 50.0 ; + output_threshold_pct_fall : 50.0 ; + input_threshold_pct_rise : 50.0 ; + output_threshold_pct_rise : 50.0 ; + slew_lower_threshold_pct_fall : 10.0 ; + slew_upper_threshold_pct_fall : 90.0 ; + slew_lower_threshold_pct_rise : 10.0 ; + slew_upper_threshold_pct_rise : 90.0 ; + + nom_voltage : 1.0; + nom_temperature : 25; + nom_process : 1.0; + default_cell_leakage_power : 0.0 ; + default_leakage_power_density : 0.0 ; + default_input_pin_cap : 1.0 ; + default_inout_pin_cap : 1.0 ; + default_output_pin_cap : 0.0 ; + default_max_transition : 0.5 ; + default_fanout_load : 1.0 ; + default_max_fanout : 4.0 ; + default_connection_class : universal ; + + lu_table_template(CELL_TABLE){ + variable_1 : input_net_transition; + variable_2 : total_output_net_capacitance; + index_1("0.00125, 0.005, 0.04"); + index_2("0.052275, 0.2091, 1.6728"); + } + + lu_table_template(CONSTRAINT_TABLE){ + variable_1 : related_pin_transition; + variable_2 : constrained_pin_transition; + index_1("0.00125, 0.005, 0.04"); + index_2("0.00125, 0.005, 0.04"); + } + + default_operating_conditions : OC; + + + type (DATA){ + base_type : array; + data_type : bit; + bit_width : 2; + bit_from : 0; + bit_to : 1; + } + + type (ADDR){ + base_type : array; + data_type : bit; + bit_width : 4; + bit_from : 0; + bit_to : 3; + } + +cell (sram_2_16_1_freepdk45){ + memory(){ + type : ram; + address_width : 4; + word_width : 2; + } + interface_timing : true; + dont_use : true; + map_only : true; + dont_touch : true; + area : 1124.88; + + leakage_power () { + when : "CSb0"; + value : 0.000167; + } + cell_leakage_power : 0; + bus(DIN0){ + bus_type : DATA; + direction : input; + capacitance : 0.2091; + memory_write(){ + address : ADDR0; + clocked_on : clk0; + } + pin(DIN0[1:0]){ + timing(){ + timing_type : setup_rising; + related_pin : "clk0"; + rise_constraint(CONSTRAINT_TABLE) { + values("0.009, 0.009, 0.009",\ + "0.009, 0.009, 0.009",\ + "0.009, 0.009, 0.009"); + } + fall_constraint(CONSTRAINT_TABLE) { + values("0.009, 0.009, 0.009",\ + "0.009, 0.009, 0.009",\ + "0.009, 0.009, 0.009"); + } + } + timing(){ + timing_type : hold_rising; + related_pin : "clk0"; + rise_constraint(CONSTRAINT_TABLE) { + values("0.001, 0.001, 0.001",\ + "0.001, 0.001, 0.001",\ + "0.001, 0.001, 0.001"); + } + fall_constraint(CONSTRAINT_TABLE) { + values("0.001, 0.001, 0.001",\ + "0.001, 0.001, 0.001",\ + "0.001, 0.001, 0.001"); + } + } + } + } + bus(DOUT0){ + bus_type : DATA; + direction : output; + max_capacitance : 1.6728; + min_capacitance : 0.052275; + memory_read(){ + address : ADDR0; + } + pin(DOUT0[1:0]){ + timing(){ + timing_sense : non_unate; + related_pin : "clk0"; + timing_type : falling_edge; + cell_rise(CELL_TABLE) { + values("0.107, 0.107, 0.107",\ + "0.107, 0.107, 0.107",\ + "0.107, 0.107, 0.107"); + } + cell_fall(CELL_TABLE) { + values("0.107, 0.107, 0.107",\ + "0.107, 0.107, 0.107",\ + "0.107, 0.107, 0.107"); + } + rise_transition(CELL_TABLE) { + values("0.001, 0.001, 0.001",\ + "0.001, 0.001, 0.001",\ + "0.001, 0.001, 0.001"); + } + fall_transition(CELL_TABLE) { + values("0.001, 0.001, 0.001",\ + "0.001, 0.001, 0.001",\ + "0.001, 0.001, 0.001"); + } + } + } + } + + bus(ADDR0){ + bus_type : ADDR; + direction : input; + capacitance : 0.2091; + max_transition : 0.04; + pin(ADDR0[3:0]){ + timing(){ + timing_type : setup_rising; + related_pin : "clk0"; + rise_constraint(CONSTRAINT_TABLE) { + values("0.009, 0.009, 0.009",\ + "0.009, 0.009, 0.009",\ + "0.009, 0.009, 0.009"); + } + fall_constraint(CONSTRAINT_TABLE) { + values("0.009, 0.009, 0.009",\ + "0.009, 0.009, 0.009",\ + "0.009, 0.009, 0.009"); + } + } + timing(){ + timing_type : hold_rising; + related_pin : "clk0"; + rise_constraint(CONSTRAINT_TABLE) { + values("0.001, 0.001, 0.001",\ + "0.001, 0.001, 0.001",\ + "0.001, 0.001, 0.001"); + } + fall_constraint(CONSTRAINT_TABLE) { + values("0.001, 0.001, 0.001",\ + "0.001, 0.001, 0.001",\ + "0.001, 0.001, 0.001"); + } + } + } + } + + pin(CSb0){ + direction : input; + capacitance : 0.2091; + timing(){ + timing_type : setup_rising; + related_pin : "clk0"; + rise_constraint(CONSTRAINT_TABLE) { + values("0.009, 0.009, 0.009",\ + "0.009, 0.009, 0.009",\ + "0.009, 0.009, 0.009"); + } + fall_constraint(CONSTRAINT_TABLE) { + values("0.009, 0.009, 0.009",\ + "0.009, 0.009, 0.009",\ + "0.009, 0.009, 0.009"); + } + } + timing(){ + timing_type : hold_rising; + related_pin : "clk0"; + rise_constraint(CONSTRAINT_TABLE) { + values("0.001, 0.001, 0.001",\ + "0.001, 0.001, 0.001",\ + "0.001, 0.001, 0.001"); + } + fall_constraint(CONSTRAINT_TABLE) { + values("0.001, 0.001, 0.001",\ + "0.001, 0.001, 0.001",\ + "0.001, 0.001, 0.001"); + } + } + } + + pin(WEb0){ + direction : input; + capacitance : 0.2091; + timing(){ + timing_type : setup_rising; + related_pin : "clk0"; + rise_constraint(CONSTRAINT_TABLE) { + values("0.009, 0.009, 0.009",\ + "0.009, 0.009, 0.009",\ + "0.009, 0.009, 0.009"); + } + fall_constraint(CONSTRAINT_TABLE) { + values("0.009, 0.009, 0.009",\ + "0.009, 0.009, 0.009",\ + "0.009, 0.009, 0.009"); + } + } + timing(){ + timing_type : hold_rising; + related_pin : "clk0"; + rise_constraint(CONSTRAINT_TABLE) { + values("0.001, 0.001, 0.001",\ + "0.001, 0.001, 0.001",\ + "0.001, 0.001, 0.001"); + } + fall_constraint(CONSTRAINT_TABLE) { + values("0.001, 0.001, 0.001",\ + "0.001, 0.001, 0.001",\ + "0.001, 0.001, 0.001"); + } + } + } + + pin(clk0){ + clock : true; + direction : input; + capacitance : 0.2091; + internal_power(){ + when : "!CSb0 & clk0 & !WEb0"; + rise_power(scalar){ + values("0.033101244168888884"); + } + fall_power(scalar){ + values("0.033101244168888884"); + } + } + internal_power(){ + when : "!CSb0 & !clk0 & WEb0"; + rise_power(scalar){ + values("0.033101244168888884"); + } + fall_power(scalar){ + values("0.033101244168888884"); + } + } + internal_power(){ + when : "CSb0"; + rise_power(scalar){ + values("0"); + } + fall_power(scalar){ + values("0"); + } + } + timing(){ + timing_type :"min_pulse_width"; + related_pin : clk0; + rise_constraint(scalar) { + values("0.0105"); + } + fall_constraint(scalar) { + values("0.0105"); + } + } + timing(){ + timing_type :"minimum_period"; + related_pin : clk0; + rise_constraint(scalar) { + values("0.021"); + } + fall_constraint(scalar) { + values("0.021"); + } + } + } + + } +} diff --git a/compiler/tests/golden/sram_2_16_1_freepdk45_TT_1p0V_25C.lib b/compiler/tests/golden/sram_2_16_1_freepdk45_TT_1p0V_25C.lib index fc8d2be3..0939b4bb 100644 --- a/compiler/tests/golden/sram_2_16_1_freepdk45_TT_1p0V_25C.lib +++ b/compiler/tests/golden/sram_2_16_1_freepdk45_TT_1p0V_25C.lib @@ -93,7 +93,7 @@ cell (sram_2_16_1_freepdk45){ address : ADDR0; clocked_on : clk0; } - pin(DIN0){ + pin(DIN0[1:0]){ timing(){ timing_type : setup_rising; related_pin : "clk0"; @@ -132,7 +132,7 @@ cell (sram_2_16_1_freepdk45){ memory_read(){ address : ADDR0; } - pin(DOUT0){ + pin(DOUT0[1:0]){ timing(){ timing_sense : non_unate; related_pin : "clk0"; @@ -166,7 +166,7 @@ cell (sram_2_16_1_freepdk45){ direction : input; capacitance : 0.2091; max_transition : 0.04; - pin(ADDR0){ + pin(ADDR0[3:0]){ timing(){ timing_type : setup_rising; related_pin : "clk0"; diff --git a/compiler/tests/golden/sram_2_16_1_freepdk45_TT_1p0V_25C_analytical.lib b/compiler/tests/golden/sram_2_16_1_freepdk45_TT_1p0V_25C_analytical.lib index afb22057..a06ff5b5 100644 --- a/compiler/tests/golden/sram_2_16_1_freepdk45_TT_1p0V_25C_analytical.lib +++ b/compiler/tests/golden/sram_2_16_1_freepdk45_TT_1p0V_25C_analytical.lib @@ -93,7 +93,7 @@ cell (sram_2_16_1_freepdk45){ address : ADDR0; clocked_on : clk0; } - pin(DIN0){ + pin(DIN0[1:0]){ timing(){ timing_type : setup_rising; related_pin : "clk0"; @@ -132,7 +132,7 @@ cell (sram_2_16_1_freepdk45){ memory_read(){ address : ADDR0; } - pin(DOUT0){ + pin(DOUT0[1:0]){ timing(){ timing_sense : non_unate; related_pin : "clk0"; @@ -166,7 +166,7 @@ cell (sram_2_16_1_freepdk45){ direction : input; capacitance : 0.2091; max_transition : 0.04; - pin(ADDR0){ + pin(ADDR0[3:0]){ timing(){ timing_type : setup_rising; related_pin : "clk0"; diff --git a/compiler/tests/golden/sram_2_16_1_freepdk45_TT_1p0V_25C_pruned.lib b/compiler/tests/golden/sram_2_16_1_freepdk45_TT_1p0V_25C_pruned.lib index b20f10be..d7d7de7e 100644 --- a/compiler/tests/golden/sram_2_16_1_freepdk45_TT_1p0V_25C_pruned.lib +++ b/compiler/tests/golden/sram_2_16_1_freepdk45_TT_1p0V_25C_pruned.lib @@ -93,7 +93,7 @@ cell (sram_2_16_1_freepdk45){ address : ADDR0; clocked_on : clk0; } - pin(DIN0){ + pin(DIN0[1:0]){ timing(){ timing_type : setup_rising; related_pin : "clk0"; @@ -132,7 +132,7 @@ cell (sram_2_16_1_freepdk45){ memory_read(){ address : ADDR0; } - pin(DOUT0){ + pin(DOUT0[1:0]){ timing(){ timing_sense : non_unate; related_pin : "clk0"; @@ -166,7 +166,7 @@ cell (sram_2_16_1_freepdk45){ direction : input; capacitance : 0.2091; max_transition : 0.04; - pin(ADDR0){ + pin(ADDR0[3:0]){ timing(){ timing_type : setup_rising; related_pin : "clk0"; diff --git a/compiler/tests/golden/sram_2_16_1_scn4m_subm_FF_5p0V_25C_analytical.lib b/compiler/tests/golden/sram_2_16_1_scn4m_subm_FF_5p0V_25C_analytical.lib new file mode 100644 index 00000000..5cbecd94 --- /dev/null +++ b/compiler/tests/golden/sram_2_16_1_scn4m_subm_FF_5p0V_25C_analytical.lib @@ -0,0 +1,321 @@ +library (sram_2_16_1_scn4m_subm_FF_5p0V_25C_lib){ + delay_model : "table_lookup"; + time_unit : "1ns" ; + voltage_unit : "1v" ; + current_unit : "1mA" ; + resistance_unit : "1kohm" ; + capacitive_load_unit(1 ,fF) ; + leakage_power_unit : "1mW" ; + pulling_resistance_unit :"1kohm" ; + operating_conditions(OC){ + process : 1.0 ; + voltage : 5.0 ; + temperature : 25; + } + + input_threshold_pct_fall : 50.0 ; + output_threshold_pct_fall : 50.0 ; + input_threshold_pct_rise : 50.0 ; + output_threshold_pct_rise : 50.0 ; + slew_lower_threshold_pct_fall : 10.0 ; + slew_upper_threshold_pct_fall : 90.0 ; + slew_lower_threshold_pct_rise : 10.0 ; + slew_upper_threshold_pct_rise : 90.0 ; + + nom_voltage : 5.0; + nom_temperature : 25; + nom_process : 1.0; + default_cell_leakage_power : 0.0 ; + default_leakage_power_density : 0.0 ; + default_input_pin_cap : 1.0 ; + default_inout_pin_cap : 1.0 ; + default_output_pin_cap : 0.0 ; + default_max_transition : 0.5 ; + default_fanout_load : 1.0 ; + default_max_fanout : 4.0 ; + default_connection_class : universal ; + + lu_table_template(CELL_TABLE){ + variable_1 : input_net_transition; + variable_2 : total_output_net_capacitance; + index_1("0.0125, 0.05, 0.4"); + index_2("2.45605, 9.8242, 78.5936"); + } + + lu_table_template(CONSTRAINT_TABLE){ + variable_1 : related_pin_transition; + variable_2 : constrained_pin_transition; + index_1("0.0125, 0.05, 0.4"); + index_2("0.0125, 0.05, 0.4"); + } + + default_operating_conditions : OC; + + + type (DATA){ + base_type : array; + data_type : bit; + bit_width : 2; + bit_from : 0; + bit_to : 1; + } + + type (ADDR){ + base_type : array; + data_type : bit; + bit_width : 4; + bit_from : 0; + bit_to : 3; + } + +cell (sram_2_16_1_scn4m_subm){ + memory(){ + type : ram; + address_width : 4; + word_width : 2; + } + interface_timing : true; + dont_use : true; + map_only : true; + dont_touch : true; + area : 73068.14000000001; + + leakage_power () { + when : "CSb0"; + value : 0.000167; + } + cell_leakage_power : 0; + bus(DIN0){ + bus_type : DATA; + direction : input; + capacitance : 9.8242; + memory_write(){ + address : ADDR0; + clocked_on : clk0; + } + pin(DIN0[1:0]){ + timing(){ + timing_type : setup_rising; + related_pin : "clk0"; + rise_constraint(CONSTRAINT_TABLE) { + values("0.009, 0.009, 0.009",\ + "0.009, 0.009, 0.009",\ + "0.009, 0.009, 0.009"); + } + fall_constraint(CONSTRAINT_TABLE) { + values("0.009, 0.009, 0.009",\ + "0.009, 0.009, 0.009",\ + "0.009, 0.009, 0.009"); + } + } + timing(){ + timing_type : hold_rising; + related_pin : "clk0"; + rise_constraint(CONSTRAINT_TABLE) { + values("0.001, 0.001, 0.001",\ + "0.001, 0.001, 0.001",\ + "0.001, 0.001, 0.001"); + } + fall_constraint(CONSTRAINT_TABLE) { + values("0.001, 0.001, 0.001",\ + "0.001, 0.001, 0.001",\ + "0.001, 0.001, 0.001"); + } + } + } + } + bus(DOUT0){ + bus_type : DATA; + direction : output; + max_capacitance : 78.5936; + min_capacitance : 2.45605; + memory_read(){ + address : ADDR0; + } + pin(DOUT0[1:0]){ + timing(){ + timing_sense : non_unate; + related_pin : "clk0"; + timing_type : falling_edge; + cell_rise(CELL_TABLE) { + values("0.241, 0.241, 0.241",\ + "0.241, 0.241, 0.241",\ + "0.241, 0.241, 0.241"); + } + cell_fall(CELL_TABLE) { + values("0.241, 0.241, 0.241",\ + "0.241, 0.241, 0.241",\ + "0.241, 0.241, 0.241"); + } + rise_transition(CELL_TABLE) { + values("0.004, 0.004, 0.004",\ + "0.004, 0.004, 0.004",\ + "0.004, 0.004, 0.004"); + } + fall_transition(CELL_TABLE) { + values("0.004, 0.004, 0.004",\ + "0.004, 0.004, 0.004",\ + "0.004, 0.004, 0.004"); + } + } + } + } + + bus(ADDR0){ + bus_type : ADDR; + direction : input; + capacitance : 9.8242; + max_transition : 0.4; + pin(ADDR0[3:0]){ + timing(){ + timing_type : setup_rising; + related_pin : "clk0"; + rise_constraint(CONSTRAINT_TABLE) { + values("0.009, 0.009, 0.009",\ + "0.009, 0.009, 0.009",\ + "0.009, 0.009, 0.009"); + } + fall_constraint(CONSTRAINT_TABLE) { + values("0.009, 0.009, 0.009",\ + "0.009, 0.009, 0.009",\ + "0.009, 0.009, 0.009"); + } + } + timing(){ + timing_type : hold_rising; + related_pin : "clk0"; + rise_constraint(CONSTRAINT_TABLE) { + values("0.001, 0.001, 0.001",\ + "0.001, 0.001, 0.001",\ + "0.001, 0.001, 0.001"); + } + fall_constraint(CONSTRAINT_TABLE) { + values("0.001, 0.001, 0.001",\ + "0.001, 0.001, 0.001",\ + "0.001, 0.001, 0.001"); + } + } + } + } + + pin(CSb0){ + direction : input; + capacitance : 9.8242; + timing(){ + timing_type : setup_rising; + related_pin : "clk0"; + rise_constraint(CONSTRAINT_TABLE) { + values("0.009, 0.009, 0.009",\ + "0.009, 0.009, 0.009",\ + "0.009, 0.009, 0.009"); + } + fall_constraint(CONSTRAINT_TABLE) { + values("0.009, 0.009, 0.009",\ + "0.009, 0.009, 0.009",\ + "0.009, 0.009, 0.009"); + } + } + timing(){ + timing_type : hold_rising; + related_pin : "clk0"; + rise_constraint(CONSTRAINT_TABLE) { + values("0.001, 0.001, 0.001",\ + "0.001, 0.001, 0.001",\ + "0.001, 0.001, 0.001"); + } + fall_constraint(CONSTRAINT_TABLE) { + values("0.001, 0.001, 0.001",\ + "0.001, 0.001, 0.001",\ + "0.001, 0.001, 0.001"); + } + } + } + + pin(WEb0){ + direction : input; + capacitance : 9.8242; + timing(){ + timing_type : setup_rising; + related_pin : "clk0"; + rise_constraint(CONSTRAINT_TABLE) { + values("0.009, 0.009, 0.009",\ + "0.009, 0.009, 0.009",\ + "0.009, 0.009, 0.009"); + } + fall_constraint(CONSTRAINT_TABLE) { + values("0.009, 0.009, 0.009",\ + "0.009, 0.009, 0.009",\ + "0.009, 0.009, 0.009"); + } + } + timing(){ + timing_type : hold_rising; + related_pin : "clk0"; + rise_constraint(CONSTRAINT_TABLE) { + values("0.001, 0.001, 0.001",\ + "0.001, 0.001, 0.001",\ + "0.001, 0.001, 0.001"); + } + fall_constraint(CONSTRAINT_TABLE) { + values("0.001, 0.001, 0.001",\ + "0.001, 0.001, 0.001",\ + "0.001, 0.001, 0.001"); + } + } + } + + pin(clk0){ + clock : true; + direction : input; + capacitance : 9.8242; + internal_power(){ + when : "!CSb0 & clk0 & !WEb0"; + rise_power(scalar){ + values("4.99880645"); + } + fall_power(scalar){ + values("4.99880645"); + } + } + internal_power(){ + when : "!CSb0 & !clk0 & WEb0"; + rise_power(scalar){ + values("4.99880645"); + } + fall_power(scalar){ + values("4.99880645"); + } + } + internal_power(){ + when : "CSb0"; + rise_power(scalar){ + values("0"); + } + fall_power(scalar){ + values("0"); + } + } + timing(){ + timing_type :"min_pulse_width"; + related_pin : clk0; + rise_constraint(scalar) { + values("0.024"); + } + fall_constraint(scalar) { + values("0.024"); + } + } + timing(){ + timing_type :"minimum_period"; + related_pin : clk0; + rise_constraint(scalar) { + values("0.048"); + } + fall_constraint(scalar) { + values("0.048"); + } + } + } + + } +} diff --git a/compiler/tests/golden/sram_2_16_1_scn4m_subm_SS_5p0V_25C_analytical.lib b/compiler/tests/golden/sram_2_16_1_scn4m_subm_SS_5p0V_25C_analytical.lib new file mode 100644 index 00000000..3324f119 --- /dev/null +++ b/compiler/tests/golden/sram_2_16_1_scn4m_subm_SS_5p0V_25C_analytical.lib @@ -0,0 +1,321 @@ +library (sram_2_16_1_scn4m_subm_SS_5p0V_25C_lib){ + delay_model : "table_lookup"; + time_unit : "1ns" ; + voltage_unit : "1v" ; + current_unit : "1mA" ; + resistance_unit : "1kohm" ; + capacitive_load_unit(1 ,fF) ; + leakage_power_unit : "1mW" ; + pulling_resistance_unit :"1kohm" ; + operating_conditions(OC){ + process : 1.0 ; + voltage : 5.0 ; + temperature : 25; + } + + input_threshold_pct_fall : 50.0 ; + output_threshold_pct_fall : 50.0 ; + input_threshold_pct_rise : 50.0 ; + output_threshold_pct_rise : 50.0 ; + slew_lower_threshold_pct_fall : 10.0 ; + slew_upper_threshold_pct_fall : 90.0 ; + slew_lower_threshold_pct_rise : 10.0 ; + slew_upper_threshold_pct_rise : 90.0 ; + + nom_voltage : 5.0; + nom_temperature : 25; + nom_process : 1.0; + default_cell_leakage_power : 0.0 ; + default_leakage_power_density : 0.0 ; + default_input_pin_cap : 1.0 ; + default_inout_pin_cap : 1.0 ; + default_output_pin_cap : 0.0 ; + default_max_transition : 0.5 ; + default_fanout_load : 1.0 ; + default_max_fanout : 4.0 ; + default_connection_class : universal ; + + lu_table_template(CELL_TABLE){ + variable_1 : input_net_transition; + variable_2 : total_output_net_capacitance; + index_1("0.0125, 0.05, 0.4"); + index_2("2.45605, 9.8242, 78.5936"); + } + + lu_table_template(CONSTRAINT_TABLE){ + variable_1 : related_pin_transition; + variable_2 : constrained_pin_transition; + index_1("0.0125, 0.05, 0.4"); + index_2("0.0125, 0.05, 0.4"); + } + + default_operating_conditions : OC; + + + type (DATA){ + base_type : array; + data_type : bit; + bit_width : 2; + bit_from : 0; + bit_to : 1; + } + + type (ADDR){ + base_type : array; + data_type : bit; + bit_width : 4; + bit_from : 0; + bit_to : 3; + } + +cell (sram_2_16_1_scn4m_subm){ + memory(){ + type : ram; + address_width : 4; + word_width : 2; + } + interface_timing : true; + dont_use : true; + map_only : true; + dont_touch : true; + area : 73068.14000000001; + + leakage_power () { + when : "CSb0"; + value : 0.000167; + } + cell_leakage_power : 0; + bus(DIN0){ + bus_type : DATA; + direction : input; + capacitance : 9.8242; + memory_write(){ + address : ADDR0; + clocked_on : clk0; + } + pin(DIN0[1:0]){ + timing(){ + timing_type : setup_rising; + related_pin : "clk0"; + rise_constraint(CONSTRAINT_TABLE) { + values("0.009, 0.009, 0.009",\ + "0.009, 0.009, 0.009",\ + "0.009, 0.009, 0.009"); + } + fall_constraint(CONSTRAINT_TABLE) { + values("0.009, 0.009, 0.009",\ + "0.009, 0.009, 0.009",\ + "0.009, 0.009, 0.009"); + } + } + timing(){ + timing_type : hold_rising; + related_pin : "clk0"; + rise_constraint(CONSTRAINT_TABLE) { + values("0.001, 0.001, 0.001",\ + "0.001, 0.001, 0.001",\ + "0.001, 0.001, 0.001"); + } + fall_constraint(CONSTRAINT_TABLE) { + values("0.001, 0.001, 0.001",\ + "0.001, 0.001, 0.001",\ + "0.001, 0.001, 0.001"); + } + } + } + } + bus(DOUT0){ + bus_type : DATA; + direction : output; + max_capacitance : 78.5936; + min_capacitance : 2.45605; + memory_read(){ + address : ADDR0; + } + pin(DOUT0[1:0]){ + timing(){ + timing_sense : non_unate; + related_pin : "clk0"; + timing_type : falling_edge; + cell_rise(CELL_TABLE) { + values("0.294, 0.294, 0.294",\ + "0.294, 0.294, 0.294",\ + "0.294, 0.294, 0.294"); + } + cell_fall(CELL_TABLE) { + values("0.294, 0.294, 0.294",\ + "0.294, 0.294, 0.294",\ + "0.294, 0.294, 0.294"); + } + rise_transition(CELL_TABLE) { + values("0.004, 0.004, 0.004",\ + "0.004, 0.004, 0.004",\ + "0.004, 0.004, 0.004"); + } + fall_transition(CELL_TABLE) { + values("0.004, 0.004, 0.004",\ + "0.004, 0.004, 0.004",\ + "0.004, 0.004, 0.004"); + } + } + } + } + + bus(ADDR0){ + bus_type : ADDR; + direction : input; + capacitance : 9.8242; + max_transition : 0.4; + pin(ADDR0[3:0]){ + timing(){ + timing_type : setup_rising; + related_pin : "clk0"; + rise_constraint(CONSTRAINT_TABLE) { + values("0.009, 0.009, 0.009",\ + "0.009, 0.009, 0.009",\ + "0.009, 0.009, 0.009"); + } + fall_constraint(CONSTRAINT_TABLE) { + values("0.009, 0.009, 0.009",\ + "0.009, 0.009, 0.009",\ + "0.009, 0.009, 0.009"); + } + } + timing(){ + timing_type : hold_rising; + related_pin : "clk0"; + rise_constraint(CONSTRAINT_TABLE) { + values("0.001, 0.001, 0.001",\ + "0.001, 0.001, 0.001",\ + "0.001, 0.001, 0.001"); + } + fall_constraint(CONSTRAINT_TABLE) { + values("0.001, 0.001, 0.001",\ + "0.001, 0.001, 0.001",\ + "0.001, 0.001, 0.001"); + } + } + } + } + + pin(CSb0){ + direction : input; + capacitance : 9.8242; + timing(){ + timing_type : setup_rising; + related_pin : "clk0"; + rise_constraint(CONSTRAINT_TABLE) { + values("0.009, 0.009, 0.009",\ + "0.009, 0.009, 0.009",\ + "0.009, 0.009, 0.009"); + } + fall_constraint(CONSTRAINT_TABLE) { + values("0.009, 0.009, 0.009",\ + "0.009, 0.009, 0.009",\ + "0.009, 0.009, 0.009"); + } + } + timing(){ + timing_type : hold_rising; + related_pin : "clk0"; + rise_constraint(CONSTRAINT_TABLE) { + values("0.001, 0.001, 0.001",\ + "0.001, 0.001, 0.001",\ + "0.001, 0.001, 0.001"); + } + fall_constraint(CONSTRAINT_TABLE) { + values("0.001, 0.001, 0.001",\ + "0.001, 0.001, 0.001",\ + "0.001, 0.001, 0.001"); + } + } + } + + pin(WEb0){ + direction : input; + capacitance : 9.8242; + timing(){ + timing_type : setup_rising; + related_pin : "clk0"; + rise_constraint(CONSTRAINT_TABLE) { + values("0.009, 0.009, 0.009",\ + "0.009, 0.009, 0.009",\ + "0.009, 0.009, 0.009"); + } + fall_constraint(CONSTRAINT_TABLE) { + values("0.009, 0.009, 0.009",\ + "0.009, 0.009, 0.009",\ + "0.009, 0.009, 0.009"); + } + } + timing(){ + timing_type : hold_rising; + related_pin : "clk0"; + rise_constraint(CONSTRAINT_TABLE) { + values("0.001, 0.001, 0.001",\ + "0.001, 0.001, 0.001",\ + "0.001, 0.001, 0.001"); + } + fall_constraint(CONSTRAINT_TABLE) { + values("0.001, 0.001, 0.001",\ + "0.001, 0.001, 0.001",\ + "0.001, 0.001, 0.001"); + } + } + } + + pin(clk0){ + clock : true; + direction : input; + capacitance : 9.8242; + internal_power(){ + when : "!CSb0 & clk0 & !WEb0"; + rise_power(scalar){ + values("4.99880645"); + } + fall_power(scalar){ + values("4.99880645"); + } + } + internal_power(){ + when : "!CSb0 & !clk0 & WEb0"; + rise_power(scalar){ + values("4.99880645"); + } + fall_power(scalar){ + values("4.99880645"); + } + } + internal_power(){ + when : "CSb0"; + rise_power(scalar){ + values("0"); + } + fall_power(scalar){ + values("0"); + } + } + timing(){ + timing_type :"min_pulse_width"; + related_pin : clk0; + rise_constraint(scalar) { + values("0.0295"); + } + fall_constraint(scalar) { + values("0.0295"); + } + } + timing(){ + timing_type :"minimum_period"; + related_pin : clk0; + rise_constraint(scalar) { + values("0.059"); + } + fall_constraint(scalar) { + values("0.059"); + } + } + } + + } +} diff --git a/compiler/tests/golden/sram_2_16_1_scn4m_subm_TT_5p0V_25C.lib b/compiler/tests/golden/sram_2_16_1_scn4m_subm_TT_5p0V_25C.lib index d6fc30aa..f8a337d3 100644 --- a/compiler/tests/golden/sram_2_16_1_scn4m_subm_TT_5p0V_25C.lib +++ b/compiler/tests/golden/sram_2_16_1_scn4m_subm_TT_5p0V_25C.lib @@ -93,7 +93,7 @@ cell (sram_2_16_1_scn4m_subm){ address : ADDR0; clocked_on : clk0; } - pin(DIN0){ + pin(DIN0[1:0]){ timing(){ timing_type : setup_rising; related_pin : "clk0"; @@ -132,7 +132,7 @@ cell (sram_2_16_1_scn4m_subm){ memory_read(){ address : ADDR0; } - pin(DOUT0){ + pin(DOUT0[1:0]){ timing(){ timing_sense : non_unate; related_pin : "clk0"; @@ -166,7 +166,7 @@ cell (sram_2_16_1_scn4m_subm){ direction : input; capacitance : 9.8242; max_transition : 0.4; - pin(ADDR0){ + pin(ADDR0[3:0]){ timing(){ timing_type : setup_rising; related_pin : "clk0"; diff --git a/compiler/tests/golden/sram_2_16_1_scn4m_subm_TT_5p0V_25C_analytical.lib b/compiler/tests/golden/sram_2_16_1_scn4m_subm_TT_5p0V_25C_analytical.lib index 5c56ab1e..72a106ac 100644 --- a/compiler/tests/golden/sram_2_16_1_scn4m_subm_TT_5p0V_25C_analytical.lib +++ b/compiler/tests/golden/sram_2_16_1_scn4m_subm_TT_5p0V_25C_analytical.lib @@ -93,7 +93,7 @@ cell (sram_2_16_1_scn4m_subm){ address : ADDR0; clocked_on : clk0; } - pin(DIN0){ + pin(DIN0[1:0]){ timing(){ timing_type : setup_rising; related_pin : "clk0"; @@ -132,7 +132,7 @@ cell (sram_2_16_1_scn4m_subm){ memory_read(){ address : ADDR0; } - pin(DOUT0){ + pin(DOUT0[1:0]){ timing(){ timing_sense : non_unate; related_pin : "clk0"; @@ -166,7 +166,7 @@ cell (sram_2_16_1_scn4m_subm){ direction : input; capacitance : 9.8242; max_transition : 0.4; - pin(ADDR0){ + pin(ADDR0[3:0]){ timing(){ timing_type : setup_rising; related_pin : "clk0"; diff --git a/compiler/tests/golden/sram_2_16_1_scn4m_subm_TT_5p0V_25C_pruned.lib b/compiler/tests/golden/sram_2_16_1_scn4m_subm_TT_5p0V_25C_pruned.lib index 64340a5b..124f80ff 100644 --- a/compiler/tests/golden/sram_2_16_1_scn4m_subm_TT_5p0V_25C_pruned.lib +++ b/compiler/tests/golden/sram_2_16_1_scn4m_subm_TT_5p0V_25C_pruned.lib @@ -93,7 +93,7 @@ cell (sram_2_16_1_scn4m_subm){ address : ADDR0; clocked_on : clk0; } - pin(DIN0){ + pin(DIN0[1:0]){ timing(){ timing_type : setup_rising; related_pin : "clk0"; @@ -132,7 +132,7 @@ cell (sram_2_16_1_scn4m_subm){ memory_read(){ address : ADDR0; } - pin(DOUT0){ + pin(DOUT0[1:0]){ timing(){ timing_sense : non_unate; related_pin : "clk0"; @@ -166,7 +166,7 @@ cell (sram_2_16_1_scn4m_subm){ direction : input; capacitance : 9.8242; max_transition : 0.4; - pin(ADDR0){ + pin(ADDR0[3:0]){ timing(){ timing_type : setup_rising; related_pin : "clk0"; diff --git a/compiler/tests/testutils.py b/compiler/tests/testutils.py index 6b2a7dcf..799c223e 100755 --- a/compiler/tests/testutils.py +++ b/compiler/tests/testutils.py @@ -13,7 +13,7 @@ class openram_test(unittest.TestCase): self.reset() - tempgds = OPTS.openram_temp + "temp.gds" + tempgds = "{0}{1}.gds".format(OPTS.openram_temp,w.name) w.gds_write(tempgds) import verify @@ -21,14 +21,15 @@ class openram_test(unittest.TestCase): if result != 0: self.fail("DRC failed: {}".format(w.name)) - self.cleanup() + if OPTS.purge_temp: + self.cleanup() def local_check(self, a, final_verification=False): self.reset() - tempspice = OPTS.openram_temp + "temp.sp" - tempgds = OPTS.openram_temp + "temp.gds" + tempspice = "{0}{1}.sp".format(OPTS.openram_temp,a.name) + tempgds = "{0}{1}.gds".format(OPTS.openram_temp,a.name) a.sp_write(tempspice) # cannot write gds in netlist_only mode @@ -36,7 +37,7 @@ class openram_test(unittest.TestCase): a.gds_write(tempgds) import verify - result=verify.run_drc(a.name, tempgds) + result=verify.run_drc(a.name, tempgds, extract=True, final_verification=final_verification) if result != 0: #zip_file = "/tmp/{0}_{1}".format(a.name,os.getpid()) #debug.info(0,"Archiving failed files to {}.zip".format(zip_file)) @@ -44,7 +45,7 @@ class openram_test(unittest.TestCase): self.fail("DRC failed: {}".format(a.name)) - result=verify.run_lvs(a.name, tempgds, tempspice, final_verification) + result=verify.run_lvs(a.name, tempgds, tempspice, final_verification=final_verification) if result != 0: #zip_file = "/tmp/{0}_{1}".format(a.name,os.getpid()) #debug.info(0,"Archiving failed files to {}.zip".format(zip_file)) @@ -53,6 +54,7 @@ class openram_test(unittest.TestCase): if OPTS.purge_temp: self.cleanup() + def find_feasible_test_period(self, delay_obj, sram, load, slew): """Creates a delay simulation to determine a feasible period for the functional tests to run. @@ -62,6 +64,9 @@ class openram_test(unittest.TestCase): delay_obj.set_load_slew(load, slew) delay_obj.set_probe(probe_address="1"*sram.addr_size, probe_data=(sram.word_size-1)) test_port = delay_obj.read_ports[0] #Only test one port, assumes other ports have similar period. + delay_obj.create_signal_names() + delay_obj.create_measurement_names() + delay_obj.create_measurement_objects() delay_obj.find_feasible_period_one_port(test_port) return delay_obj.period diff --git a/compiler/verify/assura.py b/compiler/verify/assura.py index d3c605f3..af034730 100644 --- a/compiler/verify/assura.py +++ b/compiler/verify/assura.py @@ -30,7 +30,7 @@ num_drc_runs = 0 num_lvs_runs = 0 num_pex_runs = 0 -def run_drc(name, gds_name): +def run_drc(name, gds_name, final_verification=False): """Run DRC check on a given top-level name which is implemented in gds_name.""" @@ -93,7 +93,7 @@ def run_drc(name, gds_name): return errors -def run_lvs(name, gds_name, sp_name): +def run_lvs(name, gds_name, sp_name, final_verification=False): """Run LVS check on a given top-level name which is implemented in gds_name and sp_name. """ @@ -178,7 +178,7 @@ def run_lvs(name, gds_name, sp_name): return errors -def run_pex(name, gds_name, sp_name, output=None): +def run_pex(name, gds_name, sp_name, output=None, final_verification=False): """Run pex on a given top-level name which is implemented in gds_name and sp_name. """ debug.error("PEX extraction not implemented with Assura.",-1) diff --git a/compiler/verify/calibre.py b/compiler/verify/calibre.py index a1bbbc3e..5f8d2c73 100644 --- a/compiler/verify/calibre.py +++ b/compiler/verify/calibre.py @@ -126,9 +126,9 @@ def run_drc(cell_name, gds_name, extract=False, final_verification=False): f.close() # those lines should be the last 3 results = results[-3:] - geometries = int(re.split("\W+", results[0])[5]) - rulechecks = int(re.split("\W+", results[1])[4]) - errors = int(re.split("\W+", results[2])[5]) + geometries = int(re.split(r'\W+', results[0])[5]) + rulechecks = int(re.split(r'\W+', results[1])[4]) + errors = int(re.split(r'\W+', results[2])[5]) # always display this summary if errors > 0: @@ -227,7 +227,7 @@ def run_lvs(cell_name, gds_name, sp_name, final_verification=False): incorrect = list(filter(test.search, results)) # Errors begin with "Error:" - test = re.compile("\s+Error:") + test = re.compile(r'\s+Error:') errors = list(filter(test.search, results)) for e in errors: debug.error(e.strip("\n")) @@ -282,7 +282,7 @@ def run_lvs(cell_name, gds_name, sp_name, final_verification=False): return total_errors -def run_pex(cell_name, gds_name, sp_name, output=None): +def run_pex(cell_name, gds_name, sp_name, output=None, final_verification=False): """Run pex on a given top-level name which is implemented in gds_name and sp_name. """ @@ -363,7 +363,7 @@ def correct_port(name, output_file_name, ref_file_name): pex_file.seek(match_index_start) rest_text = pex_file.read() # locate the end of circuit definition line - match = re.search("\* \n", rest_text) + match = re.search(r'\* \n', rest_text) match_index_end = match.start() # store the unchanged part of pex file in memory pex_file.seek(0) diff --git a/compiler/verify/magic.py b/compiler/verify/magic.py index 490a09a1..7db9a5c2 100644 --- a/compiler/verify/magic.py +++ b/compiler/verify/magic.py @@ -45,7 +45,10 @@ def write_magic_script(cell_name, gds_name, extract=False, final_verification=Fa #f.write("load {}_new\n".format(cell_name)) #f.write("cellname rename {0}_new {0}\n".format(cell_name)) #f.write("load {}\n".format(cell_name)) + f.write("cellname delete \\(UNNAMED\\)\n") f.write("writeall force\n") + f.write("select top cell\n") + f.write("expand\n") f.write("drc check\n") f.write("drc catchup\n") f.write("drc count total\n") @@ -55,14 +58,26 @@ def write_magic_script(cell_name, gds_name, extract=False, final_verification=Fa else: pre = "" if final_verification: - f.write(pre+"extract unique\n") - f.write(pre+"extract\n") - f.write(pre+"ext2spice hierarchy on\n") + f.write(pre+"extract unique all\n".format(cell_name)) + f.write(pre+"extract\n".format(cell_name)) + #f.write(pre+"ext2spice hierarchy on\n") + #f.write(pre+"ext2spice scale off\n") + # lvs exists in 8.2.79, but be backword compatible for now + #f.write(pre+"ext2spice lvs\n") + f.write(pre+"ext2spice hierarchy on\n") + f.write(pre+"ext2spice format ngspice\n") + f.write(pre+"ext2spice cthresh infinite\n") + f.write(pre+"ext2spice rthresh infinite\n") + f.write(pre+"ext2spice renumber off\n") f.write(pre+"ext2spice scale off\n") + f.write(pre+"ext2spice blackbox on\n") + f.write(pre+"ext2spice subcircuit top auto\n") + f.write(pre+"ext2spice global off\n") + # Can choose hspice, ngspice, or spice3, # but they all seem compatible enough. #f.write(pre+"ext2spice format ngspice\n") - f.write(pre+"ext2spice\n") + f.write(pre+"ext2spice {}\n".format(cell_name)) f.write("quit -noprompt\n") f.write("EOF\n") @@ -136,15 +151,20 @@ def run_drc(cell_name, gds_name, extract=True, final_verification=False): # etc. try: f = open(outfile, "r") - except: - debug.error("Unable to retrieve DRC results file. Is magic set up?",1) + except FileNotFoundError: + debug.error("Unable to load DRC results file from {}. Is magic set up?".format(outfile),1) + results = f.readlines() f.close() + errors=1 # those lines should be the last 3 for line in results: if "Total DRC errors found:" in line: errors = int(re.split(": ", line)[1]) break + else: + debug.error("Unable to find the total error line in Magic output.",1) + # always display this summary if errors > 0: @@ -185,7 +205,11 @@ def run_lvs(cell_name, gds_name, sp_name, final_verification=False): total_errors = 0 # check the result for these lines in the summary: - f = open(resultsfile, "r") + try: + f = open(resultsfile, "r") + except FileNotFoundError: + debug.error("Unable to load LVS results from {}".format(resultsfile),1) + results = f.readlines() f.close() # Look for the results after the final "Subcircuit summary:" @@ -235,7 +259,7 @@ def run_lvs(cell_name, gds_name, sp_name, final_verification=False): return total_errors -def run_pex(name, gds_name, sp_name, output=None): +def run_pex(name, gds_name, sp_name, output=None, final_verification=False): """Run pex on a given top-level name which is implemented in gds_name and sp_name. """ diff --git a/compiler/verify/none.py b/compiler/verify/none.py index 531a394d..c69ed93b 100644 --- a/compiler/verify/none.py +++ b/compiler/verify/none.py @@ -9,7 +9,7 @@ drc_warned = False lvs_warned = False pex_warned = False -def run_drc(cell_name, gds_name, extract=False): +def run_drc(cell_name, gds_name, extract=False, final_verification=False): global drc_warned if not drc_warned: debug.warning("DRC unable to run.") @@ -25,7 +25,7 @@ def run_lvs(cell_name, gds_name, sp_name, final_verification=False): # Since we warned, return a failing test. return 1 -def run_pex(name, gds_name, sp_name, output=None): +def run_pex(name, gds_name, sp_name, output=None, final_verification=False): global pex_warned if not pex_warned: debug.warning("PEX unable to run.") diff --git a/docs/Makefile b/docs/Makefile deleted file mode 100644 index b0d853fa..00000000 --- a/docs/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -all: openram_manual.tex - pdflatex openram_manual -bib: - bibtex openram_manual -clean: - rm -f openram_manual.pdf *.aux *.bbl *.blq *.dvi *.log *.lot *.toc *.lof *.blg diff --git a/docs/control.tex b/docs/control.tex deleted file mode 100644 index 472461d1..00000000 --- a/docs/control.tex +++ /dev/null @@ -1,4 +0,0 @@ -\section{Internal Control Signals} -\label{sec:control} - -This section not needed... All information is in Section~\ref{sec:timing} (Timing). diff --git a/docs/debug.tex b/docs/debug.tex deleted file mode 100644 index 98bab10d..00000000 --- a/docs/debug.tex +++ /dev/null @@ -1,49 +0,0 @@ -\section{Debug Framework} -\label{sec:debug} - -All output in OpenRAM should use the shared debug framework. This is -still under development but is in a usable state. It is going to be -replaced with the Python Logging framework which is quite simple. - -All of the debug framework is contained in debug.py and is based -around the concept of a ``debug level'' which is a single global -variable in this file. This level is, by default, 0 which will output -normal minimal output. The general guidelines for debug output are: -\begin{itemize} -\item 0 Normal output -\item 1 Verbose output -\item 2 Detailed output -\item 3+ Excessively detailed output -\end{itemize} - -The debug level can be adjusted on the command line when arguments are parsed using the ``-v'' flag. Adding more ``-v'' flags will increase the debug level as in the following examples: -\begin{verbatim} -python tests/01_library_drc_test.py -vv -python openram.py 4 16 -v -v -\end{verbatim} -which each put the program in debug level 2 (detailed output). - -Since every module may output a lot of information in the higher debug -levels, the output format is standardized to allow easy searching via -grep or other command-line tools. The standard output formatting is -used through three interface functions: -\begin{itemize} -\item debug.info(int, msg) -\item debug.warning(msg) -\item debug.error(msg) -\end{itemize} -The msg string in each case can be any string format including data or -other useful debug information. The string should also contain -information to make it human understandable. {\bf It should not just be - a number!} The warning and error messages are independent of debug -levels while the info message will only print the message if the -current debug level is above the parameter value. - -The output format of the debug info messages are: -\begin{verbatim} -[ module ]: msg -\end{verbatim} -where module is the calling module name and msg is the string -provided. This enables a grep command to get the relevant lines. The -warning and error messages include the file name and line number of -the warning/error. diff --git a/docs/figs/2t1_single_level_column_mux.pdf b/docs/figs/2t1_single_level_column_mux.pdf deleted file mode 100644 index 94917359..00000000 Binary files a/docs/figs/2t1_single_level_column_mux.pdf and /dev/null differ diff --git a/docs/figs/2t4decoder.pdf b/docs/figs/2t4decoder.pdf deleted file mode 100644 index acd551d7..00000000 Binary files a/docs/figs/2t4decoder.pdf and /dev/null differ diff --git a/docs/figs/4t16decoder.pdf b/docs/figs/4t16decoder.pdf deleted file mode 100644 index 0bc44718..00000000 Binary files a/docs/figs/4t16decoder.pdf and /dev/null differ diff --git a/docs/figs/4t1_single_level_column_mux.pdf b/docs/figs/4t1_single_level_column_mux.pdf deleted file mode 100644 index 32304833..00000000 Binary files a/docs/figs/4t1_single_level_column_mux.pdf and /dev/null differ diff --git a/docs/figs/Col_mux.svg b/docs/figs/Col_mux.svg deleted file mode 100644 index 4fbf41be..00000000 --- a/docs/figs/Col_mux.svg +++ /dev/null @@ -1,1401 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Bl Br - Bl Br - Bl Br - Bl Br - Col.Mux - - - - - - - - - Array - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - select lines - - - - - Cell - Cell - Cell - Cell - Bl Br - Bl Br - Bl Br - Bl Br - Cell - Cell - Cell - Cell - Word lines - - - - - - - Write Driver - - - - Write Driver - - - - - - To Sense Amp - Enable - Clk - - - diff --git a/docs/figs/Logic Diagram.svg b/docs/figs/Logic Diagram.svg deleted file mode 100644 index 2a29e937..00000000 --- a/docs/figs/Logic Diagram.svg +++ /dev/null @@ -1,747 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - Precharge - Array - - - Sense Amp - Output Latch - - - - - - Out to System - In From System - Bit LinesBL0,BR0, BL1, BR1, ... BLj BRj - - Word Lines W0, W1, ..., Wlog(n) - - - - - A0, A1, ... An - A0, A1, ... Ak - Sclk - - clk - - Bit LinesBL0,BR0, BL1, BR1, ... BLj BRj - Bit LinesBL0,BR0, BL1, BR1, ... BLj/2^k BRj/2^k - - Pclk - DataD0, D1, ..., Dj/2^k - Data OutDo0, Do1, ..., Doj/2^k - - - Address Decoder - - - - Column Mux - - - - Write Driver - - - Enable, Data in - Bit LinesBL0 ,BR0, BL1, BR1, ... BLj/2^k BRj /2^k - - - - - - diff --git a/docs/figs/ZBT.pdf b/docs/figs/ZBT.pdf deleted file mode 100644 index a146850e..00000000 Binary files a/docs/figs/ZBT.pdf and /dev/null differ diff --git a/docs/figs/bank.pdf b/docs/figs/bank.pdf deleted file mode 100644 index 4bf5dd44..00000000 Binary files a/docs/figs/bank.pdf and /dev/null differ diff --git a/docs/figs/bank2.pdf b/docs/figs/bank2.pdf deleted file mode 100644 index fa6e34a7..00000000 Binary files a/docs/figs/bank2.pdf and /dev/null differ diff --git a/docs/figs/bank4.pdf b/docs/figs/bank4.pdf deleted file mode 100644 index 5d2b827e..00000000 Binary files a/docs/figs/bank4.pdf and /dev/null differ diff --git a/docs/figs/cell_6t_schem.pdf b/docs/figs/cell_6t_schem.pdf deleted file mode 100644 index b01c23a6..00000000 Binary files a/docs/figs/cell_6t_schem.pdf and /dev/null differ diff --git a/docs/figs/cell_6t_schem.svg b/docs/figs/cell_6t_schem.svg deleted file mode 100644 index 9af83cba..00000000 --- a/docs/figs/cell_6t_schem.svg +++ /dev/null @@ -1,522 +0,0 @@ - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - VDD - GND - BL_bar - BL - WL - - diff --git a/docs/figs/class_hierarchy.dot b/docs/figs/class_hierarchy.dot deleted file mode 100644 index 00337aec..00000000 --- a/docs/figs/class_hierarchy.dot +++ /dev/null @@ -1,10 +0,0 @@ -digraph G { - module [shape=record, label="module\n(e.g., bit-cell array)"]; - design [shape=record, label="design\nDRC_LVS()"]; - hierarchy_layout [shape=record, label="layout\n"]; - hierarchy_spice [shape=record, label="spice\n"]; - - module -> design - design -> hierarchy_layout; - design -> hierarchy_spice; -} diff --git a/docs/figs/class_hierarchy.pdf b/docs/figs/class_hierarchy.pdf deleted file mode 100644 index 154e8955..00000000 Binary files a/docs/figs/class_hierarchy.pdf and /dev/null differ diff --git a/docs/figs/class_hierarchy.sh b/docs/figs/class_hierarchy.sh deleted file mode 100644 index 86302860..00000000 --- a/docs/figs/class_hierarchy.sh +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/bash -dot -Tpdf class_hierarchy.dot > class_hierarchy.pdf diff --git a/docs/figs/column_tree_mux.pdf b/docs/figs/column_tree_mux.pdf deleted file mode 100644 index c5f228da..00000000 Binary files a/docs/figs/column_tree_mux.pdf and /dev/null differ diff --git a/docs/figs/column_tree_mux.svg b/docs/figs/column_tree_mux.svg deleted file mode 100644 index c60edce8..00000000 --- a/docs/figs/column_tree_mux.svg +++ /dev/null @@ -1,665 +0,0 @@ - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - BL - BL_bar - BL0 - BL0_bar - BL1 - BL1_bar - BL2 - BL2_bar - BL3 - BL3_bar - A0 - A0_bar - A1 - A1_bar - - diff --git a/docs/figs/control_logic.pdf b/docs/figs/control_logic.pdf deleted file mode 100644 index 962a901b..00000000 Binary files a/docs/figs/control_logic.pdf and /dev/null differ diff --git a/docs/figs/gds_file.pdf b/docs/figs/gds_file.pdf deleted file mode 100644 index c79bcc2f..00000000 Binary files a/docs/figs/gds_file.pdf and /dev/null differ diff --git a/docs/figs/layout_view_1024_16_annotated.eps b/docs/figs/layout_view_1024_16_annotated.eps deleted file mode 100644 index 3b94d87d..00000000 --- a/docs/figs/layout_view_1024_16_annotated.eps +++ /dev/null @@ -1,4512 +0,0 @@ -%!PS-Adobe-3.0 EPSF-3.0 -%%Creator: cairo 1.8.8 (http://cairographics.org) -%%CreationDate: Thu Jul 22 08:02:09 2010 -%%Pages: 1 -%%BoundingBox: 0 0 776 679 -%%DocumentData: Clean7Bit -%%LanguageLevel: 2 -%%EndComments -%%BeginProlog -/cairo_eps_state save def -/dict_count countdictstack def -/op_count count 1 sub def -userdict begin -/q { gsave } bind def -/Q { grestore } bind def -/cm { 6 array astore concat } bind def -/w { setlinewidth } bind def -/J { setlinecap } bind def -/j { setlinejoin } bind def -/M { setmiterlimit } bind def -/d { setdash } bind def -/m { moveto } bind def -/l { lineto } bind def -/c { curveto } bind def -/h { closepath } bind def -/re { exch dup neg 3 1 roll 5 3 roll moveto 0 rlineto - 0 exch rlineto 0 rlineto closepath } bind def -/S { stroke } bind def -/f { fill } bind def -/f* { eofill } bind def -/B { fill stroke } bind def -/B* { eofill stroke } bind def -/n { newpath } bind def -/W { clip } bind def -/W* { eoclip } bind def -/BT { } bind def -/ET { } bind def -/pdfmark where { pop globaldict /?pdfmark /exec load put } - { globaldict begin /?pdfmark /pop load def /pdfmark - /cleartomark load def end } ifelse -/BDC { mark 3 1 roll /BDC pdfmark } bind def -/EMC { mark /EMC pdfmark } bind def -/cairo_store_point { /cairo_point_y exch def /cairo_point_x exch def } def -/Tj { show currentpoint cairo_store_point } bind def -/TJ { - { - dup - type /stringtype eq - { show } { -0.001 mul 0 cairo_font_matrix dtransform rmoveto } ifelse - } forall - currentpoint cairo_store_point -} bind def -/cairo_selectfont { cairo_font_matrix aload pop pop pop 0 0 6 array astore - cairo_font exch selectfont cairo_point_x cairo_point_y moveto } bind def -/Tf { pop /cairo_font exch def /cairo_font_matrix where - { pop cairo_selectfont } if } bind def -/Td { matrix translate cairo_font_matrix matrix concatmatrix dup - /cairo_font_matrix exch def dup 4 get exch 5 get cairo_store_point - /cairo_font where { pop cairo_selectfont } if } bind def -/Tm { 2 copy 8 2 roll 6 array astore /cairo_font_matrix exch def - cairo_store_point /cairo_font where { pop cairo_selectfont } if } bind def -/g { setgray } bind def -/rg { setrgbcolor } bind def -/d1 { setcachedevice } bind def -%%EndProlog -11 dict begin -/FontType 42 def -/FontName /f-0-0 def -/PaintType 0 def -/FontMatrix [ 1 0 0 1 0 0 ] def -/FontBBox [ 0 0 0 0 ] def -/Encoding 256 array def -0 1 255 { Encoding exch /.notdef put } for -Encoding 1 /uni0041 put -Encoding 2 /uni0052 put -Encoding 3 /uni0059 put -Encoding 4 /uni0053 put -Encoding 5 /uni0045 put -Encoding 6 /uni004E put -Encoding 7 /uni0020 put -Encoding 8 /uni004D put -Encoding 9 /uni0050 put -Encoding 10 /uni0057 put -Encoding 11 /uni0049 put -Encoding 12 /uni0054 put -Encoding 13 /uni0044 put -Encoding 14 /uni0056 put -Encoding 15 /uni0043 put -Encoding 16 /uni0048 put -Encoding 17 /uni0047 put -Encoding 18 /uni004C put -Encoding 19 /uni004F put -Encoding 20 /uni0055 put -Encoding 21 /uni0058 put -/CharStrings 22 dict dup begin -/.notdef 0 def -/uni0041 1 def -/uni0052 2 def -/uni0059 3 def -/uni0053 4 def -/uni0045 5 def -/uni004E 6 def -/uni0020 7 def -/uni004D 8 def -/uni0050 9 def -/uni0057 10 def -/uni0049 11 def -/uni0054 12 def -/uni0044 13 def -/uni0056 14 def -/uni0043 15 def -/uni0048 16 def -/uni0047 17 def -/uni004C 18 def -/uni004F 19 def -/uni0055 20 def -/uni0058 21 def -end readonly def -/sfnts [ -<00010000000a008000030020636d617000a1f12800000fb00000006a63767420ffd31d390000 -101c000001fc6670676de7b4f1c4000012180000008b676c796685f3d158000000ac00000f04 -68656164dd84a2d0000012a4000000366868656110450779000012dc00000024686d747875cb -0aa000001300000000586c6f63612cae2944000013580000002e6d6178700451063a00001388 -00000020707265703b07f100000013a80000056800020066fe96046605a400030007001a400c -04fb0006fb0108057f0204002fc4d4ec310010d4ecd4ec301311211125211121660400fc7303 -1bfce5fe96070ef8f2720629000200100000056805d50002000a00ba40410011010004050402 -1105050401110a030a0011020003030a0711050406110505040911030a08110a030a42000307 -95010381090509080706040302010009050a0b10d4c4173931002f3ce4d4ec1239304b535807 -1005ed0705ed071005ed0705ed071008ed071005ed071005ed071008ed5922b2200c01015d40 -3a0f005800760070008c000507010802060309041601190256015802500c6701680278017602 -7c0372047707780887018802800c980299039604175d005d090121013301230321032302bcfe -ee0225fe7be50239d288fd5f88d5050efd1903aefa2b017ffe810000000200c90000055405d5 -0013001c00b14035090807030a061103040305110404034206040015030415950914950d810b -040506031109001c160e050a191904113f140a1c0c041d10fcec32fcc4ec1117391139393931 -002f3cf4ecd4ec123912391239304b5358071005ed071005ed1117395922b2401e01015d4042 -7a13010500050105020603070415001501140216031704250025012502260327062607260826 -09201e3601360246014602680575047505771388068807980698071f5d005d011e0117132303 -2e012b01112311212016151406011133323635342623038d417b3ecdd9bf4a8b78dcca01c801 -00fc83fd89fe9295959202bc16907efe68017f9662fd8905d5d6d88dba024ffdee8783838500 -0001fffc000004e705d500080094402803110405040211010205050402110302080008011100 -000842020300af0602070440051c0040070910d4e4fce4123931002fec3239304b5358071005 -ed071008ed071008ed071005ed5922b2000a01015d403c050214023502300230053008460240 -02400540085102510551086502840293021016011a031f0a2601290337013803400a67016803 -7803700a9f0a0d5d005d03330901330111231104d9019e019bd9fdf0cb05d5fd9a0266fcf2fd -3902c700000000010087ffe304a205f00027007e403c0d0c020e0b021e1f1e080902070a021f -1f1e420a0b1e1f0415010015a11494189511049500942591118c281e0a0b1f1b0700221b190e -2d071914222810dcc4ecfcece4111239393939310010e4f4e4ec10eef6ee10c6111739304b53 -5807100eed11173907100eed1117395922b20f2901015db61f292f294f29035d01152e012322 -061514161f011e0115140421222627351e013332363534262f012e01353424333216044873cc -5fa5b377a67ae2d7feddfee76aef807bec72adbc879a7be2ca0117f569da05a4c53736807663 -651f192bd9b6d9e0302fd04546887e6e7c1f182dc0abc6e42600000100c90000048b05d5000b -002e401506950402950081089504ad0a05010907031c00040c10fcec32d4c4c431002fececf4 -ec10ee30b21f0d01015d132115211121152111211521c903b0fd1a02c7fd3902f8fc3e05d5aa -fe46aafde3aa0000000100c90000053305d500090079401e0711010201021106070642070203 -00af0805060107021c0436071c00040a10fcecfcec11393931002f3cec323939304b53580710 -04ed071004ed5922b21f0b01015d40303602380748024707690266078002070601090615011a -06460149065701580665016906790685018a0695019a069f0b105d005d132101113311210111 -23c901100296c4fef0fd6ac405d5fb1f04e1fa2b04e1fb1f000100c90000061f05d5000c00bf -403403110708070211010208080702110302090a0901110a0a09420a070203080300af080b05 -0908030201050a061c043e0a1c00040d10fcecfcec11173931002f3cc4ec32111739304b5358 -071005ed071008ed071008ed071005ed5922b2700e01015d405603070f080f09020a15021407 -130a260226072007260a200a3407350a69027c027b07790a80028207820a90021604010b0313 -011b0323012c032708280934013c035608590965086a097608790981018d0395019b03145d00 -5d13210901211123110123011123c9012d017d017f012dc5fe7fcbfe7fc405d5fc0803f8fa2b -051ffc000400fae10000000200c90000048d05d500080013003a40180195100095098112100a -0802040005190d3f11001c09041410fcec32fcec11173931002ff4ecd4ec30400b0f151f153f -155f15af1505015d011133323635342623252132041514042b0111230193fe8d9a9a8dfe3801 -c8fb0101fefffbfeca052ffdcf92878692a6e3dbdde2fda800010044000007a605d5000c017b -4049051a0605090a09041a0a09031a0a0b0a021a01020b0b0a06110708070511040508080702 -1103020c000c011100000c420a050203060300af0b080c0b0a09080605040302010b07000d10 -d4cc173931002f3cec32321739304b5358071005ed071008ed071008ed071005ed071008ed07 -1005ed0705ed071008ed5922b2000e01015d40f206020605020a000a000a120a2805240a200a -3e023e05340a300a4c024d05420a400a59026a026b05670a600a7b027f027c057f05800a9602 -95051d070009020803000406050005000601070408000807090009040a0a0c000e1a03150415 -08190c100e200421052006200720082309240a250b200e200e3c023a03350433053008360939 -0b3f0c300e460046014a0240044505400542064207420840084009440a4d0c400e400e580256 -08590c500e66026703610462056006600760086409640a640b770076017b0278037704740579 -06790777087008780c7f0c7f0e860287038804890585098a0b8f0e97049f0eaf0e5b5d005d13 -33090133090133012309012344cc013a0139e3013a0139cdfe89fefec5fec2fe05d5fb1204ee -fb1204eefa2b0510faf00000000100c90000019305d500030039b700af02011c00040410fcec -31002fec30014bb0105458bd0004ffc000010004000400403811373859400d30054005500560 -058f059f05065d13331123c9caca05d5fa2b00000001fffa000004e905d50007004a400e0602 -950081040140031c0040050810d4e4fce431002ff4ec3230014bb00a5458bd00080040000100 -080008ffc03811373859401300091f00100110021f071009400970099f09095d032115211123 -11210604effdeecbfdee05d5aafad5052b00000200c9000005b005d500080011002e40150095 -09810195100802100a0005190d32001c09041210fcecf4ec113939393931002fecf4ec30b260 -1301015d0111332000111000212521200011100029010193f40135011ffee1fecbfe42019f01 -b20196fe68fe50fe61052ffb770118012e012c0117a6fe97fe80fe7efe960000000100100000 -056805d5000600b7402704110506050311020306060503110403000100021101010042030401 -af0006040302000505010710d4c4173931002fec3239304b5358071005ed071008ed071008ed -071005ed5922b2500801015d406200032a03470447055a037d03830307060007020804090615 -0114021a041a052a002601260229042905250620083800330133023c043c0537064800450145 -02490449054706590056066602690469057a0076017602790479057506800898009706295d00 -5d21013309013301024afdc6d301d901dad2fdc705d5fb1704e9fa2b00010073ffe3052705f0 -00190036401a0da10eae0a951101a100ae04951791118c1a07190d003014101a10fcec32ec31 -0010e4f4ecf4ec10eef6ee30b40f1b1f1b02015d01152e0123200011100021323637150e0123 -2000111000213216052766e782ff00fef00110010082e7666aed84feadfe7a0186015386ed05 -62d55f5efec7fed8fed9fec75e5fd34848019f01670168019f470000000100c90000053b05d5 -000b002c4014089502ad0400810a0607031c053809011c00040c10fcec32fcec3231002f3ce4 -32fcec30b2500d01015d133311211133112311211123c9ca02decacafd22ca05d5fd9c0264fa -2b02c7fd390000010073ffe3058b05f0001d0039402000051b0195031b950812a111ae15950e -91088c1e02001c1134043318190b101e10fcecfce4fcc4310010e4f4ecf4ec10fed4ee113939 -3025112135211106042320001110002132041715262623200011100021323604c3feb6021275 -fee6a0fea2fe75018b015e9201076f70fc8bfeeefeed011301126ba8d50191a6fd7f53550199 -016d016e01994846d75f60fecefed1fed2fece250000000100c90000046a05d500050025400c -0295008104011c033a00040610fcecec31002fe4ec304009300750078003800404015d133311 -211521c9ca02d7fc5f05d5fad5aa00020073ffe305d905f0000b00170023401306951200950c -91128c1809190f33031915101810fcecfcec310010e4f4ec10ee300122001110003332001110 -002720001110002120001110000327dcfefd0103dcdc0101feffdc013a0178fe88fec6fec5fe -870179054cfeb8fee5fee6feb80148011a011b0148a4fe5bfe9efe9ffe5b01a40162016201a5 -0000000100b2ffe3052905d50011004b40160802110b0005950e8c09008112081c0a38011c00 -411210fcecfcec310010e432f4ec113939393930014bb0105458bd00120040000100120012ff -c03811373859b61f138f139f13035d133311141633323635113311100021200011b2cbaec3c2 -aecbfedffee6fee5fedf05d5fc75f0d3d3f0038bfc5cfedcfed6012a012400000001003d0000 -053b05d5000b015d404609110a0b0a081107080b0b0a08110908050605071106060503110405 -0402110102050504021103020b000b011100000b420b080502040300af09060b080502040004 -06000a0c10d4c4dcc411173931002f3cec321739304b5358071005ed071008ed071008ed0710 -05ed071005ed071008ed071008ed071005ed5922014bb00c544bb00d545b4bb00e545b58bd00 -0cffc00001000c000c0040381137385940b80702080816021908170b2708270b34023808360b -4b0858055b0866026b087702770b8602800287058b08850b9402900297059d08960b1b060109 -03080707091601190319071709100d260128022903260528072709290b200d350034013c033b -043a063b073409340a380b3f0d48094f0d580b5f0d650065016a036a046805690669076c096c -0a78037906790778087d097f0a780b800080018302880385058408830b8f0d90009001940297 -0597069508930b9f0daf0d405d005d13330901330901230901230181d901730175d9fe200200 -d9fe5cfe59da021505d5fdd5022bfd33fcf8027bfd85031d0000000000020003000000000014 -00010000000000340004002000000004000400010000f015ffff0000f000ffff100000010000 -0000000600360000000000160000000100020003000400050006000700080009000a000b000c -000d000e000f0010001100120013001400150000013500b800cb00cb00c100aa009c01a600b8 -00660000007100cb00a002b20085007500b800c301cb0189022d00cb00a600f000d300aa0087 -00cb03aa0400014a003300cb000000d9050200f4015400b4009c01390114013907060400044e -04b4045204b804e704cd0037047304cd04600473013303a2055605a60556053903c5021200c9 -001f00b801df007300ba03e9033303bc0444040e00df03cd03aa00e503aa0404000000cb008f -00a4007b00b80014016f007f027b0252008f00c705cd009a009a006f00cb00cd019e01d300f0 -00ba018300d5009803040248009e01d500c100cb00f600830354027f00000333026600d300c7 -00a400cd008f009a0073040005d5010a00fe022b00a400b4009c00000062009c0000001d032d -05d505d505d505f0007f007b005400a406b80614072301d300b800cb00a601c301ec069300a0 -00d3035c037103db0185042304a80448008f0139011401390360008f05d5019a061407230666 -0179046004600460047b009c00000277046001aa00e904600762007b00c5007f027b000000b4 -025205cd006600bc00660077061000cd013b01850389008f007b0000001d00cd074a042f009c -009c0000077d006f0000006f0335006a006f007b00ae00b2002d0396008f027b00f600830354 -063705f6008f009c04e10266008f018d02f600cd03440029006604ee007300001400b6060504 -030201002c2010b002254964b040515820c859212d2cb002254964b040515820c859212d2c20 -100720b00050b00d7920b8ffff5058041b0559b0051cb0032508b0042523e120b00050b00d79 -20b8ffff5058041b0559b0051cb0032508e12d2c4b505820b0fd454459212d2cb00225456044 -2d2c4b5358b00225b0022545445921212d2c45442d0000010000000200001def707c5f0f3cf5 -001f080000000000bab9f0b800000000bac26791fe89fe1d0a4c076d00000008000100000000 -000000010000076dfe1d00000abcfe89fe890a4c000100000000000000000000000000000016 -04cd006605790010058f00c904e3fffc05140087050e00c905fc00c9028b000006e700c904d3 -00c907e90044025c00c904e3fffa062900c90579001005960073060400c906330073047500c9 -064c007305db00b2057b003d00000022009c012601880204023402880288030603460424044e -048604c60536058205b006040626066c06b407820000000100000016004d0007004200040002 -00100040000700000415056800030001b8028040fffbfe03fa1403f92503f83203f79603f60e -03f5fe03f4fe03f32503f20e03f19603f02503ef8a4105effe03ee9603ed9603ecfa03ebfa03 -eafe03e93a03e84203e7fe03e63203e5e45305e59603e48a4105e45303e3e22f05e3fa03e22f -03e1fe03e0fe03df3203de1403dd9603dcfe03db1203da7d03d9bb03d8fe03d68a4105d67d03 -d5d44705d57d03d44703d3d21b05d3fe03d21b03d1fe03d0fe03cffe03cefe03cd9603cccb1e -05ccfe03cb1e03ca3203c9fe03c6851105c61c03c51603c4fe03c3fe03c2fe03c1fe03c0fe03 -bffe03befe03bdfe03bcfe03bbfe03ba1103b9862505b9fe03b8b7bb05b8fe03b7b65d05b7bb -03b78004b6b52505b65d40ff03b64004b52503b4fe03b39603b2fe03b1fe03b0fe03affe03ae -6403ad0e03acab2505ac6403abaa1205ab2503aa1203a98a4105a9fa03a8fe03a7fe03a6fe03 -a51203a4fe03a3a20e05a33203a20e03a16403a08a4105a096039ffe039e9d0c059efe039d0c -039c9b19059c64039b9a10059b19039a1003990a0398fe0397960d0597fe03960d03958a4105 -95960394930e05942803930e0392fa039190bb0591fe03908f5d0590bb039080048f8e25058f -5d038f40048e25038dfe038c8b2e058cfe038b2e038a8625058a410389880b05891403880b03 -878625058764038685110586250385110384fe038382110583fe0382110381fe0380fe037ffe -0340ff7e7d7d057efe037d7d037c64037b5415057b25037afe0379fe03780e03770c03760a03 -75fe0374fa0373fa0372fa0371fa0370fe036ffe036efe036c21036bfe036a1142056a530369 -fe03687d036711420566fe0365fe0364fe0363fe0362fe03613a0360fa035e0c035dfe035bfe -035afe0359580a0559fa03580a035716190557320356fe035554150555420354150353011005 -531803521403514a130551fe03500b034ffe034e4d10054efe034d10034cfe034b4a13054bfe -034a4910054a1303491d0d05491003480d0347fe0346960345960344fe0343022d0543fa0342 -bb03414b0340fe033ffe033e3d12053e14033d3c0f053d12033c3b0d053c40ff0f033b0d033a -fe0339fe033837140538fa033736100537140336350b05361003350b03341e03330d0332310b -0532fe03310b03302f0b05300d032f0b032e2d09052e10032d09032c32032b2a25052b64032a -2912052a25032912032827250528410327250326250b05260f03250b0324fe0323fe03220f03 -210110052112032064031ffa031e1d0d051e64031d0d031c1142051cfe031bfa031a42031911 -420519fe031864031716190517fe031601100516190315fe0314fe0313fe031211420512fe03 -11022d05114203107d030f64030efe030d0c16050dfe030c0110050c16030bfe030a100309fe -0308022d0508fe030714030664030401100504fe03401503022d0503fe0302011005022d0301 -100300fe0301b80164858d012b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b -2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b -2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b -2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b -2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b002b2b2b2b2b2b2b2b2b2b2b2b -2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b -2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b -2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b -2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b1d00> -] def -FontName currentdict end definefont pop -%%Page: 1 1 -%%BeginPageSetup -%%PageBoundingBox: 0 0 776 679 -%%EndPageSetup -q -Q q -7.707 667.777 760 -814.398 re W n -q 0 0 777 700 rectclip -[ 0.8 0 0 0.8 7.70649 -146.621008 ] concat -/DeviceRGB setcolorspace -8 dict dup begin - /ImageType 1 def - /Width 950 def - /Height 1018 def - /BitsPerComponent 8 def - /Decode [ 0 1 0 1 0 1 ] def - /DataSource currentfile /ASCII85Decode filter /LZWDecode filter def - /ImageMatrix [ 1 0 0 -1 0 1018 ] def -end -image -J3Vsg3$]7K#D>@X%)XnS)[qKi@M(SI<[AN=7H774jC17kO2kcD3>@cH-^$o,1:^r(>q_R=Al - C^cenm@9:1mM9jS"!dTMT<$3[GQ$8#0$s<4ZX!SPQ1`C/mNDH?Y*`p%]Z?>d6a`U`\M^gHS4lm;rFK>V/<(qZ?>*KS9PE`kN%="Tc - _Aoh+fk'&t\ctIN)4XQLiVpoI(:n)PVIBCN6D34(t\o4p0?mdmM[+f#sfZcAPrEgA#a5h8d - >eXi0S^6MAHe+")]cj7E(p*PZ6rh=(,dIU>=;fBr>1IXb_>k - P!3[Vlc]Ift`[fh>e`R/.f:bLf>(u5`eYM$):=E-ON-NZ7cGM&A/ef_T5Ys"%2R2%gbY&,R - "-9O_e;>`Y"/@)9.f?D&^M-b]Or)0EQM7_.Yr/KL>6F%3\!B,B/Q#Lb+;r8TFs'-pmL#6o. - 2n7&kl1.r7]s9G7iR1!Gh4bqmTX9[u#FPAZD"ReA#&7l_T:DFlX - =&W,$D-PU,c#m=DQ0j!,fF2m^h95J.;*e44Kb%3UV:)/KAQu - 3q"f9]-K4i>X*UBMpk*UsSG;IuP]_l6B/'B8MY1F2#togO[JR;Q;sjr'1jRHBp<.>]GRr7&kmMh(\Wk^\8KI^4"=I@mb9Z&'5nhV%E%]U:DLk=S8TF]2mM_]%)L2, - .77IDD=PkJ&/cf!g<&o@/]mZ+3X#J[G5d8Hf(qS.Vr7DWhm;2:I_VrMHJ[8kmX/ciS>^i#J't:oC2_h'IH - k2!V1*/TlD/n/Vn:pfIP:QfhqN6"JcN5E62prpC^;/&."OY)%fp'k%tWm6"$jp@"CS;J82+ - ?VR+O1tTZe4*:b=<9pe;''6\L,SJ\nql>moVE0nrNM)FIKS!/[3MKT6)c^t:J0+L?AROIcb - 8L@RW=/8(daNS-_39Y]_t9'5JO4,#`F-&j"%0ZPhgDEbjpV8=Ko3( - hB^tP>Z9n8_H6SjTAD=`5YEd1^<4&j@P?6OU/M=d0JI=Wg5&R7QQlDM;sP\QI;@/adGLLjo - iMf;\!81n3%H-F\^s%4"%u4RRS3CcPcA$B.X.W<"=LV=q*d?KE@\jmXCKp)Ik.g\id> - hLsO3C6`@[0UGK?%*kDqRkli6+<0!,:)+I:G/7b3r3^c@R+U6n1dA>3q$;B,S9&WISRo5]F - 6-*,!kq,3"<=Ya&>)_3N!A8oJNa,6"S:p!WXd,/0=[VpRE3_Fc*+n= - Ue6o7;8l(Y-qB]b>LoJK6*8?\%qiLun?Cf-sj.'BO\.'P3k8\^+K]7>\9M0#h#C_- - @:XJsQ(uYL=4ak,7i_VKjrc0^e)`$3o8qb:_aSZoY+0'6EnSTDtKZC5l,akSpk1FT'C](-o07XI:0N(%$ - 'eUA's>AIX5h1h$#6M=a?h0\UEnMXDhq:+`XDlY.i^=,]UTo-1+DYgBZR\2E\*O300XSqrR\+N1`.$ - t:2n?SP68_q+NAj'1skYeE?@(B533>`Fm:7S/?%`unM@'8R7n*Q.VI'$pBGNU@M%a12C1@S - Cj+ZNaj^=cYa]p+V#A3!DZ4.94.@eP;8i.j3+?]\)m_/BcWT^#B@Xnfk.W(LfrjD^CjD - $#2F>bMq_q`KX.;&dIaVCq8nhQ_%I^&WLUhB:&HieRE;d@$#]!76.u([1A_+XFU4@%JNqEl^6$;?\WOV*Q.Z'cf'(h"A64&Jd@(_]2[&enX_2LWdX!gde<+OqK$ehj:If-kD - 8]c?-E&!0f2!f;dXiUD'2B=E?pAsA^&JiDhP9.Zhp(us8*RF25LFMDO5A.5ICpWmpsqY+qg)3[qn - CDA^lI(/O4=4a"TWKIT[29_c_+D0')7G_n-qSN&#cLi*s$=+rX^"MM.6In??cVI\T`5$*]<:9[q=h%1/-;ZAf;%0YIa,33s1C - UWgI\0]9BT'sV$ZjOY$@mW5H[%o-k:BI - @/(JhF1&Otu:!q=Su]MJ+sn2V5!U7_V?$ZVRPd@2$DV&D(f)A0(iEN^:cYo@\j)mQ - ^gn[TVO]c8cK*-'4C;:-Agdi@o.*O49Z+X1qK,-iL=dO?C1m[\>s=U'h$OYZWmOSXu^o8uV6Pt&2IT+:HJah7eI=$&9 - :nF0i&YV2]47d/.sZjnhhXJ"Y^Sp0Ja"ho*mE1$Sc]70p<>,ZQV'p,r*jt1,CF9F"K1(0f* - l(1UAqpdlB5U75Qel1_WS?F&+X!;)NDp125=WVCZ&.3uG,`qGQ>W0BE!#:B[t%%rt_s;Hke - 0i*NTN1U?`Zj<@nC51U/sY,cO_e42Os<$S82dm6)$t3lP)`PEo2q4$M-UXu#B.LLc95G^\<1atp@P=;iW4&f9KF@ej,CI%MG9.?o2e6PL=Y=Nb*8MkEV"W%9*K0%MM72+uO'6Q - pd9gSDG4Og3!e,qjU#tC/%(UPhee.YJ3cUY=^89Cn!1r2PdRn]-h8TWibFM0^Goh/5u8eff - J<<5ZjhaUT*7LKAj'am3j#u61\r!I:-'YdM0?Vkk?8(#Nuo0:b;;q'W"oi4Y+[o%7\::)L2eS.u^rDti[5;b`&"f4so6W^W:6$2'ceON;43 - E,TZ;mYcXVG5?OW - 5m62I30<4`8;ei-:3$"6k+Dt\g$emh%'I<2i1CU - R#AFt7ZUZYro!Pk81%[ht)^V/$76B6BVYQUtk79^S%7G*aRZbFnT!/6FB1bF-3J&WNHj - "d3`]j5G8Fr$o61ttDjGB,pT&I=MgL]U?^EQk[K1`!Kj/<]AJ3AnjoZliprZ$hISi6:p!2b - OWmGZP_aj[DqHhen31%s< - (b///-"pALI'tVPQa0QaM1ZVFB%6!q(O8rH(PO_BCH+8+[WR9?ULBO,Hh\F^2K+=p6EaI;L - KAbSpk=P!?%mBIHC.KZpml$L-W-7lBfL$cQ)TD["_r3HMcYOd(o;n/eO*D@MO)#42kbu9@@7)D7@Q6GV(guYD@9PJbX_<3&Q - KDZ&#p=GkgQ-eXqX7?]k(_NS*E:f`un85pgJ5UGE_gDF;ZH:d-[(,ac-NUG52` - '`f$+HIuLooOr3^i\J^Pg;2c;OMKr-V)3'iGpPRWMLN5Oeq"9j'q2Q<(N`>P5fjU587@Elp - 6+G[)2?T7VQ^KbN;e/!_`ctV5DYUH38hNCTVY?Y+3tmtQZME)D$7b908UsDRJEL9]#Tb/l@-7Nr%AQ;.uUA4bNFMj:923]!qNl@EIH, - <]F4cT+JHb'ZFH$>P()jtmgG*G:(3.$`$UJG%!VHBmnRR`^t@uGM!U"Y:">#hGS$&;P9W#* - jXg1kjKB;]`^RmmEH\VlDJ4fZ)ANgWJ;Ks.:T]rIMYW;8NUK]ekl+,sBbO`]'/pB,,U'r@? - \XTrF-^spXJm,Req[[mtO--taY^:_Z<_'aUS[/,XZ]b)Sq9hjFml%`22\ - Pd#n0[NpDWr\@VL-DnH1]Hfgn$=,),e?%H#'`)=1888Vj=WReW$ - 'm%B"S&86YX.1a?*2pXl?*;qR^KO"@MQosf\S51QHrG)KF/GHTa-bF`]Lf?o]><12` - E_.qoKC1Ijg#V2cTL%,R]k!pbKb6*OeoJ4>??1,V9,8"brl``ft&m80PJ+)`man,`(e%[he - !igS%R"Upqsq\?bfphlT9s@4Y=ES1!Q6)c-T=@Rt>#FQde-KeQf`4]Sk@QY0$E8YFHcfPZF - KEh)opn8j,$>n/3%j:S4nIb-&P^\+i()SHCh)Bmj41VoBeZZ= - />p7d(f?h4Yb@q@:]ZJ*?.='_7aZT%E,DY)<`i=F^gt_!C>X.,Y"5\3.d+sI_)fsD,!T>#$ - coqcdG#d+aOj^:_E#c'a*>d_*FN/^qA_e`oI1P364hJA$WLUAuSN5^.#NX%2ar5Vu^!#="" - lru3f)>-TrS?T7;W$8*X?+,WmW[SljM>-Tb8in2fNm>tNT;*-,TZ:4\1,q?rSG15^"uE'Sp - $9GQ(E<.jdJ+g[Dh582XC@=f/o,UrS-<1EQ&qQl[GtqVK_F>46DEsm9X2:IECoJJ5@elm!_ - Ol-OX_(L$i8Ie=@?>^DEA(&)b-(hd68aIcp!Boq*7%RU!h\gUG?hp[Od&hHgZX54@SsZ1=M - Sl1tb801mQt+B3)+cY#;ZE(u"G`jHj@"\=XHAZNJF][#OeK$HNprBJfQ2sEHh07NT3Qt"=Bq3c3[UpDA$-gR=Mb[+p`r\a+.c1oXuaBi"qh - @G(H::D4jY!1V`&,5i!!@1mnJJ'2#p4d;Tl - I%?68'UH^Z*YnKQ\4ZKLf[[q.-'U$^Alue#9A1LH1:5V%O&&&kP6T:Z?AoAAX`hTMajV]%' - P)&ZnC#dOLLhLG+V7WtkJ*#)*qY:SG4Rh3tB&NDnn:b2nr:@'%oIF\APLBkjR!/^nu6LC%d - `8F\Wah<)1W_-_2+pjP9gK:lI%dVI(m,CZRbZ]Q`F2S44\ddl*sk/G4-;S\ch<[).9K"[kd)YH%3*d=MgWYlK1O;5<8mA@P._ENr.\h0i/gNL-Dd#d_NG/.cgQ@DSsWs_6/,`!^1BeYlI'$HB - /7i0(V-fZ*=-$"Ll\22%I-3X>:AI0WRbW2K6T,keAjA?GjY'HlEmAcc]/[3q6G](:hiAk16 - d-9Uu&<%RY:)^$TpAc,sru'XfSKXAH.E8j':)b*%.q/^3YKZStVMK];@.d*,Cs_@Km(i4pn - U^HB:dl8jVp%J9lE7$-2J'=tNUf06EY)pjMh'V`Q19Q"\R,uQ7P[nT`fUpgH3Z^]299ls*- - m7d0n#/.H:m5lOkn:P^X3me)cfi75_.iqUW14*2,/+QZ"ksAKZ!$R&[rU2Ko]]aP>@%8l?oC38PH+DicXGj.2S"rQ%orDXle/-oDK(hp - /Y^u=rY(c6]I))LE>h;^P1/1B)dC_&V#)J->mu]CXE0?=R`pl["dh4>CtC4XpiOEN[4jG^Y - ]g_gPr@L*Q\47ACP4"\Eu'NGTO;$inN\tU2)N_QH[eDVo%=O&jR>"7o86L'X]q^(St;-;jn - [bi,O6/L[`mH-p2O;a2kK?&8JuDglSeHD5IE[2HMa(.2cVNU\\Eq#I+rBf?Z!aT1Bt"q+:J - X)LV:d!"4I:t6hYpZYfso7)#@NR7=$Vq$9n2U"j=g'J+-&6'?DZnT)"Cn%&st.#Z12&;rE9 - urTQXkGk2b^c>h15(D?JbgRtn:K+NUo\2XVG+qnToE>A",U0@46>6p(i76A4SJJ=^Ic%h;@ - /&V.$`o;)%Gd$p^_g&QT@@RO0WtlWg-f#]7P:(\HH3BO)U;nBu&:[Nb%Req\hB+gY6dUi<8 - 9aM8RkdBaYd(FQq'-fB"B0i3:-Ud?[.9p?9SIL&9>u^,&7Z\I44)OO7u4JHSANs>NZ'!/#u - _\:>Z?qCIPa"iEu*EPQ&X+%1e/AT*8g)SF;"Po0ugN!,0Qo[%]S;7-ZoA8]@P*]4H+aTMC'.k%^pXE\#M0hp,LmYM[o/<2Yqec^:YoFYK,pM\ - m4qnW3-Ah_r-k(c!WaW!Td`14CPb"L)A<*.2<(R - aV$e]>!knT/J3FDZBl>q#a/ne&YgkElcci38)s[\=YoJS:o[5OaDF58PcBC8=]n%Y"\PKN$ - D'SP8GFZsEMc]cT[-fH94s5g9bj+H<9*F$kZYEd'H4!KMU=:0jDC^bDL>L[#=R]#IB/HQOO - oq\5a;cfXg'(*<(b)GW23(^&]2H5.Tp*C/0qI)2OrIE]_;6,ej6]"-[PeW#f3?4,Y-$eI1T&aXb("`>RVKT]lE+'Eqf=F8 - B;W%JT[%mcJT*a(+nO)>:rA;m">Ee[6.\M - G^H4FrcHDu@J^mqr>j1PKXS%%af5@#0?]4H/ - [Z3+lGPZc\Hinfd.tPRg03>15CRTi*POKl,3 - -=[MJdl/]m+`KSX`31E)'PhGu$*USAo\lmPhn+)JS.M_k$C$"3*=p($@][HLl#Y`d09CkP[ - +4EB]kFp`C=1]EarMcCra4(I@>U4,*=@Q.GeM1[0eoFA:iE`Tm)Skip1?&drf-ApV`s1I+^^a%u+PQS[YB"N - %248YR2>IultL-!H,-K-BoRi]*s&uOu95i]qr6_(-<0o3ut]7NjF!pqA`l+A533]XW#n=N" - 2*5S?56$sWS*#udmjMB9Z[e([qMnU7^+td?E6?BN*6`!)"e\Z+'Pq0#HS1I!qeA0H/65ttP - pkZf9T,#cE6Ak1u3jM*\V^mt2-U]/^KK):d3BQO%03IU-S$]-,012b=_E5R`KKUnD-:<%f6 - 5+aUZY`&2R(K.B4%(k8@^'M1Y7^r3<<_@/ZH>Y7EF9=IbW`<77"CeI..6E - 8704>^,,Zphqb8];%;62X/=S5mNa_Sm3G&0+/.bZ:gX?8%7"6o7S+Ugui7<5TD4_;o5poKg - Jr=Jb(]_HFq!(oBbR'Lo0*7Z8W_S8GGL7)pQl6VMAN>]N;==[pUa6&\RYr*26c[mkaka((^ - C>WtYUj/B"4.\Z3"),lMT=\)*;Oq`S@WI.5[O@V.<7$JIuZm`qo(VGDH_!2=jC?!''2+@)m - aMYnde8n*DNiq)Q8JEdK!j8H>N4`Ch`WSQH4HIKuQH#_e]Mt-;e="2?:!&7I8$fXg/65=^Q - q?Y)8DKFAr16KmF2haeRd&Nu<1-&-P=i3^b(QY3e>p`6P"Pq]aZMQ*e3ZVMHcP3R)sjh"/? - )8+Bu\)u8h/9-.4DA6:HBIG6S(8;KXn`FeOke/YEBJc4L.$l"O"_8ao$NX/=WOOU.b]b75S - :4*5T[[^rqDL`Iu"<$JW[EThH`>]O[m4/A]MoaNX9GbNt9`/>#PQ_b5s69hV1ueCI2jY"Nk - ]bqX966_dAWe]eMube2@t4=eV>(!Q%&8d*nm[&QH;e0k$cM]1?qWX$hT/X*!PXto$4b#-ID - VOp!@&S1:S`:=eg7F&:.R[iaoh!:kcMFadp\\uak.9angQ;)J*bM.nH4Is_0XN+SIc6OCUo - YsUQgr(C?7/WKG%+_6@.\_UVc?)V#eHnZ,Tb&4@bG=Q#"NO,^kKmc%:)'h0D#@-&!\]N89n - ]$4e@&43%Sa>D:^$bdr=RET)Gl,)c4(ag*?*$.`m@Cq:gG*QjQ=eE$d\1^61#pL<<5gQ]>K - =3b`W#tK\jTT][Be!dLp9@$sZY8/kR+k9e?-96En_mQW"&(;(W.'eKE=H"]Cl@;Df?>I3d4 - J2p4'%e!/t7%0Y.e@o&&sFo[@(TVaGu. - r3n[\:F>mZO^0E)PiC#37_<3q:uqF5rZM!G; - `#c:I9t$t#L[`#e-q>a!Me4k6jPhjn2$t@g-HIApEe89]e/D! - k'B[][gb*@\4"btXBK2mn^emri(XPHnlLJc1UMq.K&+>#t29hHWVO4(,S=+"U - ]NL*ZDR8scefEIPm4[.@93n%Z#2t]jI1q(oiPZ79deH,uHWNZ`k;Of=6g20X7S/PCDMcdr\ - &oF+>"Xqh7ES%S?fj*W=japYCl-dg==7pGW`J.M!X]IBcgKh:R!&R=4PXPm$ - 66m\6Buj`P']$Fdu*AX4LopdZo[@-+Kdge(hN(>lAHoV;>F1_H>(6=P^aH[GP7Y]\U6,gsp - >mrP[6_`S;JE?!Y"tD5H*:dFL1]gmm8(NQ,;+*c#7AnakqaZA9XL%3m7FLo"F?L6>$r)f3]`E1mB=XE$5Xn5trgg5^%?2`egc*gqP - ^gKS^?=]S\XiF_l]%glu7f=sg>[lPB&):1le'6b-[I5E5"09,]?:GMf/cj4fo?/HY@?qI,[ - GYGI#2nVa@?"gT'fTRGKjht;bH5#WeZ`JY+5NM)?nLV&<[V=Hh-1U@>Em+`D@t7p/6:S`@& - =XrQ%WU9(>h"rd-_;%/aVL\mpWpZim""PhBLEc\mR-N@ob'gAYrtNp"\Cb)"%H9*Z/@(*ar - )/@J1&gk!MtZ%-1/>?hg9o>X>S/h]/4^6HTPog%\(3RFN"+PR=UQVGeJAmUYk9.>:d7/G3S - %pWj%Gjb?oLXA*5a>0dU:>3t'7oPVY9-s_rC8(?tgh8@]0;Js.SIDKHKG3 - 8d_iY%_dXE8(*K&7SYkJhW-&g*l^#2t`kLd$\?qJ+l\#Z3_s-M']'IqZCcgQk*kgo@`G8[^ - m!K4X:;:Ue$#D625d&3b-Hp:9nnb2=Cb,[)k0ZEUbj>&HD)TB#>L73kc0LDB^]r5&VUk)4e - 85DtD0FWMB$S28cgBlAmCqJm[bPXng?fs=DA,/"f&T)FeF%5'[V"dlNm2IEkAD7:m@NMue> - V=WIa8Gr:B!m^FRMupU(/o]mp>Z=\u%m&o:#ULjR2VX*/C_f\6pAR\RZInL;<4Ps6o[^E$# - +"0*(K+!cUX3E)-[W?O(OO#]O\fn:(a`Y6o6`$1Q7KE7YM;h[a\p&9-eEE;pO?%h`kH'6-e - \nQuuMB,,E)(ib$CEH`=:L@;ofC2;\252NS1DR8`eiTs&PnKt`T(BSL8"nDm%1kRT%cJ5`J - -Ls(snn00759R]G+`8gu4RX]h[jSj>g[`rMnuN(:?S6B&-Z#8>29.Q@="nL#0lr+*DDs@7- - SG".i,bMBn96@'h`0s]-oMl(F&Ub/[lUgm47999F13uDB'OGe5]ZTVEpkdQDa*b7.Ir\_F5 - K@W(In%\s)\cJoB.q$pIB?J8opn'FY?F-%jX>'+a!0DFcTPi:IOj\7BuK+RQN=nK&f^F>>K - _>miGVIK_Fl,@^m4^AZ#!?q7!<1W^>iE2V(de`ejDtO%;ZgYVp&ED>^:eODhk$C(>9rp/F( - *WkD]0HEd(T6\-Ie5e9%p%OnV2d8 - "Xr"6K`VuKm@TijsP?Gr":$"EI$H+_SMVgi8AkSMtZV,Gb,k"T9j7YbPB#+89]2F[YaerVK - cuWp]maDmtkU0a*9?PGdiBQ+,/1QG[Iq*H*=D'@4_9lI![5lH^b$P"2ss^]R+"dGFI4\(s5 - EOI/4Y*/bc4jLSRABO=GINqZiO"s/PfHLl.P9TNB&.Vg\E^`d6$HHe6>ckAu!ZR.5YSp0@iHbXDUpTj]=S,I%kn[DglPkKc<7Kk]+guS7>CP^m*j#U9" - IMK%W?MC$"o`uAqbpbV!M)eQpgNc37GTZ&G2h*T'berC+r:3W%=,mhk'7(J^q12"`&*\NRm - +=8f,0AKTG4h!to_jH7GTIq'9_8Sj!WE(M5p1+p4=1"8L-_JokU[Je$\Uq+d)6&n/JWq-@Z - fle6734u`h>*MUlH0*Pt<,)`+#/s&XCE!Z:I*8;(RjLUXRlVVDgl+cfWUM"G2=qSkEM`g-! - fA25Eb*;(?DAQPlYjBG=#PWZ`^p;X7>O"BI<7WR58,3iqV?2S%;80KP2FV-g7Umhbh22Hs4 - me`o'g's;74_-JW-g(fA,P+gcQfDAS:)g7k./2fWXmgYhobU-2C'ln_b`TUq/I;AjW?E`1$ - qa^W8gRu8N2EFOFRaZuCl)JmJ`Q&e'bM);aI@^kp7SVQK=a+TJO%o> - 9apNcZ]V_(Me:fXsrE^ltq"1Zo:!&+hQh5B+Oo"hF%Wi7'^tA2Ls5Wl$b+4,mGuWB`#0nI[ - N06hH^);8aOha)J?_)R,<.N?'s^A2rqpBoB(".5'\sM8!n$#6RXN/B]J4mULf#bVO'r1TAf - dBX#.uP>OFrF1h.1:Qt.]&2fI&Rk$]WPHu@B'!`4ibO/9,pd`d_6P;Y'KLmQ9[$s&D8d8u[K@i-s2`oAa%?6lV(?Q8f8.Q>L#M.d2AgtK(!l" - C8G87!]Mo,Qfb]dn(AD=X3btf:u5\D[Z%.iF6rpACt&\QJ^78I!K#&!-UZA.S=Op.bS1":f - 2#\+!Kp)1'chbD=IX`WA"/JdR%j%-B?7nkmg#U7NRrrmg:1ENqrq(5h9dn32P3W2^/SG>;S - "42`;2C3a./iOjb98n+$BeDet6kbip+lkZ0?;D2q=qI=n=<@=td.-.bBX9;L<.+%<3ORk-W - haiDb%RXoQ2"i7B%ia\hNcoGePnn(8hCAhDQN^c'X#f$[i=:O,[Cpc-9$HK9RXfsEPK/FJo - ^c@iDV32">Vn==A)H0oJ;YNG&4Tr]\ec:Ofl6XIoC!W$8![Ka,UQNc(W5tWhK,WDS]qq%%- - 5A^#=^h$KY?]1:UnR_j@7e[^.EHbQjL+,:<>bkd9o72s[.`,8d#%@AFED)/cYK1&kWjPG@.=I;lJ&0o10&AFdZa%rP+R\8;SJ6jAI+)? - dtAScAt&AhOeF>9aGi/g\AT9QF0A-RV7G;bC@YNl`[o-Yi=O;Y$5iNbBGY@l.*Lb_NN%'[% - 5n"_C(YNK*oL0,Yun@H6^?;R,8qU@TS"m#4@(U-$8l6PCN?\E=sTZ#sKa5b`Bp6Yp#A?4/d7'IZC^-_Sc[9?8\fW*[%5D^]U7ifH:;pC0+ - ),bUAk?`o.GJ%,WY9tG:`*rdkG3KOoHKN!BQ"#%/P;ee`JZl>V*uHDDPHNPI@fZbZE%u5Hr - Vlt7k,kbA#t`59pVZI.W[A74`@DrAoZ6[K30S]NfWgD_Auhm5H8!QSpc@"P17=ijkGp5q,JhDS*Blr(`YI - DJbC$^?_bAh`>Oqhus1soEtOm]'FrKed%6C*oC0N)hDqE9Y`D9k/GJWK+i3;I:L47eMNik - E>adhuTLUNZ$j$-G7Xo&X\YO<-Sf^)3;//aROUELn/h\@ogd3rP?7?:&GQp(:\+PF6I2<0h - cE2s'64J$VUaPhG@&A6d_lP.j!&Qp$^DF!!uY(2h0]4$.+F%AC*dLe;tCb20umRkMJs^0)A - Yi6<:6S7YKr=)FmL%#Es6[Z%OKgJR0Wq3!H5gf2n7=R"EFS+@*LLcTTWBmF&`hY3"H%/TT<'g5?UW%88a#U)cTaGa.o0gP8ju+Z.8`X<#YCLJPLYNYB]b15.^\9 - tPH^N7Bs2.;Sg*X>d3giPW5)mrN#;bRI6\0>c(Wgpm,3`$9PjutMdQ)&)kP[3=F\VCX3kmlE45"OpcA1$KB/<$ - 5eCr0H18dNsUb0!"bb-OIH;*.0sk`#;Bir&8_]WXTia( - #7ptG&@W#YRgP7`$S\alcf5=._[8*<#B3*;OFmp;dgM8p$h2sZE*i`%T+)@.%^>%'d,>M^# - n4%V%.Lk?E=WQ+it,&W"H`9`YO)o6*ORE`7q%@['$#m9cnM:I`0,%1r&90nE%u - V,uAJ.gR!7=.::oOflAI),n;/p"G:X$)CK`%YJr:*DmOT?+-LD$kE%$><:cqtY-#ndgf(_K - g_OV\m4Tbc$-$5&+5&IT4*eJ#2^(pSc4n\#nRP8_gF&s6$*Oj+'7[10?s*DsKj&[)[a`l*`6eEsjBdMi/h4.s;VZ.FmWM)sI`d\#''+1(!`"YWUIVnI.>1FVfe; - ViHA%S[')J@2'eftr0f'#.AA'_(%l*=41G]4u9+m/>.5)=Q1[6Ylk'h;!,;56*11SokUYR] - s(GM%11ds0(1KuS'__RDqIL@#OP>8:gEA7\,dk^;M#TU:Z/@?.83)\Il/23I?CGZ]E3HI6: - abqr1ZS9QY/b=*Fo;o$O#;Qs`.`R9oa^Ak@4ZjBS\9$/+duQYUP,0rp2tO@4e$V?f`0=2u3 - )d:L'8\VGRkk`N3+r+FP<1B%k:fjI3qMe;<#IL?o/\HX6$)+E.b-`-d57kY4J\N$;fb9"bc - NBM1hr(3'BGO%\pa1b7!!uFBPBX51IWK9plSH+a`g6QVG&SC]BmnqX/OU(/D#WZ`mfUh9:W - g+(sPWOM.PW^brTL>G)Y]5/>8cV-oU9>V]EPk.Xl[nO0f9JjU@FOneQgJ5-#:R'q,Pj(uISTD,Fh(LP#uPim=LH7X("67Whc076>a9#023ChFqcWT==dA - qmFqWJn[oeps?Bp"JD[B^Wfib`->P3\XQ1\Ro.p1>+?^8T9p'YAR%p`2PnVkY"Q.KEp7:Yd - d@WkgZqFnO(m1PSY9RpFAThq/I*14g - tMcN)srHWA]r-B6PeGo:^(:01N - )"GLl%RPHAtJmrhc,GIJ5G')cg08TqS2G5#?iQT]SVfX@,fHZr+J2JID[AUB.pH$@"]\".n - JTg![sG*b"2f3N@_RsgWII(/!UPNR"2Z#FmrE#4'o[jQL2d675XI^5XCB.IaF?Yail29i=I - [uYtS8=;BJJ^9FIa[%@5Y5 - NqnNj38Kl<-%'tiLRA[5fnYh08!#_YOZ.E6!mGJ*(=q+WJ(]aFe'2pR6&V*^J(Do8c-mJ23 - J7KuS;[-5psD/2f/cMgRsCbq#W4TB/X]a1Ml1J'ed(X/6C@-k%dX,=6KV_a^m=k0-J]1MkLQ'k"AZoP;#iJcKS1YS1i]%=!.FYoQ]W]L$VqN\4O - pr*#EJ,8c@],6E.2lujMXnof6faFg+2)Sk9ZC6-"3jG?'rMIhe-=j*?t6i5ZKUT.Pi%CT@=+f:?*mZMPT?gE3A?q4SaAL" - ]V7Wroc_EN^72XD$Hp)m>ph6`9eJQPs;.\p^g;Trcs2SN?GL8HH0o0tgd/WOjrFH9nucO,r - #mKfd&CqZX1Tp,G.oZeA!Z46rj"mu!U4Yl"1#HkEN/!Mb#GYr%lUr!eKF-'0&HXI1NE\D+0 - UX1B6cN&tU`]19-X/&1sc_tpc+];IsLT>EX7^736XHl88,l*<@0`k0X74E8*b.DHbJ`dArD - >WKFO?+_.CX?-](r&(C"J\lf&^cPnsHVM3oIE=TgWn]&"*3mFE*Q'ZD[6)@0]S41LM8?ZL_ - q^`U(kJ2%caO:M\%$S*4,'5K`K2)459#E%K`bd@F(bs>-T30XCSSR*eZ#(la(B_NEHf"Ln[ - 3YG]3J^[gSN0L(X7k5kZ0-7IZ`kq%;?PGBQci/IZ - %eZLLJbfl<^[Y*hhiL8*aKdl(5@s[Rjt8U[4S]lFs64T$-HNQ"YWmC#6VlG(4-'ZW4`imbZ - FXIZX6h7upp0TiDrhoHS"mqphofl[Tha-^[ - PP5#Jo3WY@?[))_rV#-*pR_9Wp7G[kL\MsZnUDYU+(t@uF7[/=p"#?(?bPiV:\\;/q`_.[+ - 2@TbebkYO,SCb=nbX*mHR#dc)3DfbE`"%ORjC;rs+14NJ%so<8/rBW#DGI;OI0i:*>+)qiU - L$7=t(8I7UqR:oPQl6O@\G1=U^ln.$I87P.>\7@4dkik#5EYhIej<:8\c9o_*huThjlo)C6 - Ga8YXYt'ZsE6ThhXdWg+L):9@[#f?J? - XJ5Yip*80/t[I+f%KK)'cu6Wcf!Q)IU19,#Ku)`G%i#sPP3eH&$)/h5Di,3qmiq(^BM62/* - Q@b/RuBn_2o'3!(*iA,iQHkCT@4sDtGsX_Jo-#$UTr&2"sA!_jqK)0apn]68:#Q%)_Abe@m - Z=1'kfQkTkKu8?@(;+M>!1!@(1A'U^>hnoU3J8i!cO,=sZ?V(>6E9J4;WZ:);OJ.i?B1eeW - ?br&2dAD&lco5s,IbTHu_3D>S,0/(H=lQ\X>ZJ;]MbL?[f3(\3D'.?Ip.uQdBe6OFfdF.D4 - 7*N$/#lDi1I2bl'1u0HIajg6h1t:%rF&9C8R$?qSSPK0IF2Y,QX - .^Kgt*!ZB%rW"EHbY'S^Slk[QM(QLRlhg!EaNT<&foon4B<]QMrbGCm[<0f.:O7! - =[DM'S`k`#kPjSUD=s`:K$CaSPs"CM>kuD,(WR75BcA,n29q_a-cXQ&%`p5/P?tYSd.<#_Y - 2m/7!QaPQ:Bf'e>#,0eE*SZpcLgf6:Mb0cGB)872#UdXFPXE3U[qb\leYt(pIeq:rY_rScQ&h+Rq2FIpN%jnF5ch;K[Ik`\0_UoXa - i+djb:>RNik\Ur?"@c]P+t,U`]&b&drH_:8"ul<=!23oNK2HqM`orHdRe!U7WjQ+[G2S]l, - \iDPofpAS39o9LHAV,l$Fnafma<;tE=tEKaUl\V+FAr`0t%_8=K*9Ll/RKEH*,+uK,(.l>E - 4i#&3o@0-DCU4P`ZF33[ggU,j\]B=1ip@=n__Bsd,8FB/With/Lm.,/m3#@RupHdb\)g]k_mQO05>G]C*>C2,l)m#(2$Ki - d(1S%'Pt+iER?7%1FG8RUlfP5;6!J:W"h%\PQ#j:H%SV]%5XVQ)ML;1j$_oJ0;)7?o@+*r4 - /onWQIQn/:J!oBi/CX.m`nb\q;D#seOQC"%I_c7YoV:DCeB`_K?5C:,=nbl&V?IQcl0AWjN - NCU.R(@D.dBHm'lHsmIS8.I8jN@ge=RW[-f9.t-fMRBX - :be4sH:><01\QA6PG-^_TsHb;bu8h_$Ur)!<.$*3SX,rW'&4n:miOnX3nP=KTa"6K@LJEqngt+QS/Kg@2:,qhGB'NBl1fdM - p):"11SLg>.?CA^A+&;&>@drH]16*%f:?n@)JhVqRd5o;JiQ4lr**.[BfP_,^*=&_>NP1Q6 - K&KLr*B;1CEW3Ap:f%A-Yh"e[BfMOc-feE9 - kt3SVUl7tYW*)ohZ-ptgCJHUt;2T(U,A`YsI1nr?5SZ=Waag2gtA]$4 - 9_f(.t9:Rgn!+3J]DNfPW89BYApR.b;Dgj(b=FU9\d3js]snOKY;.b%k;SmtJX3PDqo]3u[ - FMpL4E-g#1R>4jsqh`V4QpC?"fSgS]E]s*;?NmT.tQ@\Knn%AEZkMAE"[DV84nJkA,L\m;r]e%&5E"mBX8]nu\j&:a_!DXu>OK9Om67le5KhqLr!^B - "!C"^84o>jUA+dL0s1p5'^f0Yd'AYXkr4msd^FTH&bSEL?(Vu%I4Zjb#HjdY&$pfg]_/&^1 - 1a9f$+2JpE4^9C$$ld'r"2a*[6B!!P_p:[i%m`$!4hN,Z'Ho]J*kWFa3pWXU.l8=aQgWY+POZf=HcO= - N.;`-b7hoKU9XoYj3l0e?,9F.]p=]cK9c`EEhH**5P7T"5gd_@,&9WU[s?:IWK+7G8VJld\ - H#(San$73Z1lZNrR5=2mji.3)Ee>\CR"BZ;#e.RQ@k/%EP+Q,O_Y7@U!jbZ)D0Bs_Vla!=b - U@@G0*,8BP[-#$+%M93a..->XB\2iHnGh656Ha4;i8MpB#f">7?gM9FF:Ss)8qG& - 8/u,1S:8F=>0$hR6k^.X*-T?7LbjF#70JX_>GReqj:Q)$&Zh6,aTDr^R#K]=&9.D9E1;jBQ - B"W,WOr("j)d'!Rb./H`ko<;hVb513O^P.\I'uX\\rT],9-Ci>Gl:9/\P$2?9*#.@auK - Jq3>]kt]1^q_b:Jq&4Mm5.^5=JRb4+akCq!)CZqQRRbbVU>9W=.R^.c2]bP]"Hq!q)u\kId - [9&.J2[&"AIdnG_JbiI3p7+9:8Yt\3L&HpY/i:]lu\]`49:%[#Z/BuB1_5ftgR4C!2M1S,H - Kr3;PcAY',o/N`A5a,'XcHP],oo6C3ktdd+:^mP)>nG%>$.#r(8:4tl9PVuq7o+O72AHqJo06IF-"#9#$/^H=i&gcm7:6Lg1\L[]rKeOXBNET>(fOQ.KJ1fX'3cQgC:@m*Nn,N? - e].q>@"^B't7CHKj,RrgSMO9c*^dK]\7I[0=a$r9t&fYWS@cs>D-]q./ - 7!5akY.Eg\o2tM99%V`*?TWgeGUUS]fca^g"4l>FiF^FRWK\aP>V"gcUGKD!g%)eQhLi>h, - r^HTKuBhVH`);@HB-]u+.#d9W=%:6!TV"it"]hHaFH`V&9H`Pl/SkdY3e',$:1A`_[c[)SB - s>tsEe`SK?ehqWY@hNcf%D:[SZgGBr/gu[MNSaFDhe6Orqhli0DXIV@2'n>>B3'>?k%YV!0[M6k[)H:mN?Dh<*S]UL7*8hu - 4GK'LQ:U.MIO`=md/6F?`.Z7H0%82FTJ;$?+hP_I79J/1GtTrX@g=al#UUURY=lV#d$m]46 - :O@pUi14j;r](?:%I7625pgiVJL/5Nfuj$ko`ajaT+1LkSLj&85'p(^CkY@7$4j<:e`c9pY - 5T&_E*iqQ=tWo_N:2&`W(7EK(H0k7:X>V9]Ui]lRs&*C$"0mVG`IFhsRP.L'Qk - +cbT[$rPZ@qHKH7RaWGSl?RPR,#,6g!-*f2I>S'39OTAk72UA^1-5j;J-bqk4*`XDJ/'C7; - ).jB@_]K(-e!>jiO&46a7dZr^bA!)+^VOQqaXG,k=a.1#!G;?"Ak&gTd@D/lMLmkQNilp5# - ,+GmMWBZc/I2a86KHAbklJ/$3X*JTXlk*V-t4FJ@d28d5"L-1ju0&4oM+(H7$`jOdbImh'`QP;X([ok - hd`b7HuJ3,NG6o2Ysu7NNBX'@Zg5'!at@j:7"FsD&[H@hWXAMf'S#Nfo*+L_/J[H^JoVUQc?>%G0+U-U?\Vo;.2 - A#REfMIhjLq9m:N[TDR=='d2f[eR`:*o9LD\fj6C_O(2fi!G+77Kg*#8"D,!XfDZjssZ09R - WUY_$c$T;I;,:*1d2qc&WqYCi`qQ2[o16 - ^JRcG0n'XOI[Y7Wq=%E5ReErNTj[4A1\)b%Dg$MAVOI!L^i"n1Ds1g@M3(i[ed"Ia[FTbj96E7< - ^_5%gh_0d-4g6oKNY$2apU$*qXG*_nhW&WPrnI/+ZgA&pGGg9f1<'Qg+dkoB-?m[6W\8*:F - D6d9`Gbng^#MAo0sImjCTj,8Ba6lh*JEF+6;mjiJFtk%Z/J0NU"%B4556"7k$0RR]Ma:Hn@ - SrH-p$FSB5/d:%+2/a>hsCC`XMf0FA+89(OoFIq0/U&=H3`cTLNn)h1Sk'ZI?+iVBbS, - )aZgQsa>^M0Dg1fuj`.`dHDdn>7sj - O@$$?B1q1"+m-^f1MlZV0jp@#hSc5D+;DV#qOB=DN_B6Z'(r1CZJkK%OBCXU5kFaS-(^J8-+>&^pQ - GZQcss$#l6!UtE&ID<'j\f^YRhY6IhHC*=]G@pORBDbhsHiKmg6&ffsW:>7fDP*tG5pCtK?,gL6aS4tA0H/. - P-5EJM_EU"7<%kFBoW=dihZ:Q%68EA-s9\,b9M:1M8C)&WU&fZSVU$WUd+3^^U[N"M:b9]]_J:tY7#,Rm(c=^V%#:X4?EG;E4d%W[]4[lmmQN38F! - qZ'2IOD$koG>3t&s[nZ9!BjVY@E9EQ32%s1;5`9kcG(Gh*d0`=O=`&A^>03gj%8Sh"hK$,W - ;Yp2PT7&&Eud%fhF92dW[pW8PMkrHRUd_u6tX]2>35L2/.$Tfq^#sC7g*9RT"%i^]t.^:5n - lS?q!HS)Etbi9kj%\.),:@YZ?&kT@XT010Cd?l^e1f?D6V=I;tPXjtbf0@ff[(BMhD+page - o7Z&Xk+91^ETQfQ&.0Hp*9j:=d1HJ8$W^&eAf*X'cU#eEkS^;;"h!IOP(9j=$ - =l">?;Q36E78c)`?CdN"$f:(M#$0:=<(!!o;JIZQA=Yk[;.MbgL(\V"?*b,D`,=b[fYg3$>ss%8].5=jo - 3%FJbH=jDc/?Wk*]:0bEeqnaqqK9E0B=`:+X - [l]U0=]]J`&X'!e)s67F5%cWWntopm - II;DfC#Of<+;LNhK)04mt\2p^!V?<]Dbt'36FFrUuB*C(,Su^C?.\=aeh[H1eb,]YQh/5L8 - lufAGc`s'Pmo61=dQ^ZZ(n?mGM:YUONVGQ.d'*"@D%/;Gkq*%O#?gKTJY8YIJWb;D^U3OQn"- - #b;JMCf#qm.O7GBU/W>DQ`JCu@i_27gd*aU:W&GG9CgN,VL(d!Hf - ,NaLFH!KA)b)g7*ocNZLlotA83$2YU6Kh^;6iC,GnhK2oRW,:P"3Rg,8$Xq+HfW+4@WHk,U - 9B/P;+gaaiOQ2V!Nc!dE3u\8Ll"Gm$`k'*`^4J9-Bq([=tnY2Tkh]%H1![QBK*P6?g4TP^i - a]KTrU3"2t'YRm3>ERJ=H#bcY;>\=59NcG+(10dY?.Jk+B - 6b'6]Bm6,+#oUf(=IF">W5Nh\?T^:5@5#,t4c/(SarA - N_tZs7d0dkU_JiO;HNHEeuZu]A:\,PF^I%l,hlB2KiF1d>tlZ8m@$i#][G>7:TNE-XD4]BRcS+]'lLG0FU - 7<)UOQJ?MPjIE-15k]s)i)A1MMiYSDW)V6Skn].C,,k.pm*MWjC7\WjrKV@I:u - .Yq51ZX8?d2/U`tf$UV$u.t;H=NP_]mt?=Qf\>)m_rmR\0m*)t" - chIY)[h-FZYq/oW=P@s,S(HMF,M6lW7I2[Ab[VZ_<'_u*kWR8HC/GYts't^l12)2+tK;UM# - HIE&l9enU]:FqZ'Y\BFjW`uLF<@BCc@[IF]kt)DN40Z[RT+?Rq - l@gmK8)EZ!#d4mpb^e4(bom])Y/T/S*Gnl=.RU@c+ - +:qHM9cPs2MkVPSpotrVq]9r83Y&g6t-K!g$,G8iO9t^+Qoi.,\amI>Tb]\R[h@j+DGCB[J - \[=84)E4OY'+:Z4EO+V@q2K)gq2UaV[II!<#B5Z&Y.TbFiLR_\fqcKi>fmlDMDKCBh)cH> - n-E7iKY?Z-uD:[6hU[PNqSrahU2@aa6gI-g8N8.So*:\[Bj'$BU/lu#)`YR750%bU56ndgQ - XXo-2A*<8k8qJFO;N:+k"Pk5LQdEeD2%PHBebks)C!UiY[O>c7JE(+K*klN@6W`H"8C?mH0 - RP:81CnOCZR[UIVlNL\am^?4OXs3;G$]`*J.Zih+*sN2'##=IN/O9,LfN$8snu^KRXb=X>I - e8\qo'hBIC2W7])"Yp-.q>79YCNZM!rEOFB2<3ucdqQ%Ra=k:8'd_.n0%0)`*mX!!5k2oYY - P:13;E=XdGrNVV%%EA%d - 5891W(9gF6-VWPTG9J\f"jqf.bEVem,7@At)R9k?Xa9ihm.b%soC7GVn1=i_G6Y=l?P)rCE - BtOZfbr1k+qbV4d17/BM]Bj"#jtCmnq@Bh]a:pL$`o`[cDp/IU+HP7]F - F;&deik;'q/;VqWFRg1MS(X:,BZPOSP)HY1i)"7>Y1#3I`8C!Dn%23LqD\"QqD([U^0J^6u - ;H5W=.48##*`FoCOj>4MHM5f(0+jO+ZP):SB-:&-&(0"!nW`?>k*,4\FFZIM.D_"f_n*tii`F*A*KRm - D(75n0qDEr.i5XJHT;,#X4@0M!D((_Mu:J].Cgo95V:4k!;_>2GY$Uo2OgIFJ@AcZV=El - 9D&#S[/@5;!DR.`i`,3o2"=/ek=Glk//4Oe[0"k.#1E/ODH.0[[1c1\G.Vl:dH8\O1`K(&2 - ,(B[HGU+hFQ$3L6VOlW9uL"@DCJSmNc=/]dh@m7"=Do<<3\YtBCE5r>W$;:.d&V;/F3a&81-fPFg-MZ7.O'L1od_/+"iFt6/- - T#+0"B%A%blpGD:CM>VP!k*3a$iN_`m8D/5a/g_!X:n`05/e;6B9`'hlp#.k*GcM!-!$dSf - "Ysb")M#CD(J+i(5B3^mq]"QD3[n1QH$qqbAS/e)><$'QM5=kokjDhCGpN3f''todq6"4=] - TL\pEa]9+)s%.DV!>W9!N?%,B:/*Z*s['er+=q2.(PYAN'^3%fD))^*g`iaSlcVm.7\l%fn$+AJr05RaGQ#Bs+33gQ8f_JQnO)Kl\!;3Q - <4!NpbdV);O#g-MHE`*$$CrH-&&=TL$6X5.O0\8-\f^CLDWU9$5&&\:Oq]sL_u,$\7D-iLl - jZ_OLUF&GbU^qVhlj=T_P"333@W'l\&tDLY,mc=?hETRG0=BU - LEs,&72Jb[EJ=M9Z\B8tOiNX>ZB2s#r7rIT9PO-h&VQeLKZ9ggVMAFj#0,WB9^eBSO2W`T? - m26hZW69D?X!_$<#;tT>L#0\u.$RKhHO] - 01G'22n`():\t5ff.5eS:taHYoN`57@^n=PrYB^c$>lu6_)VtP]![oa5*'7o]jPmlFE%Ln2 - HYYFdBT0,?^q8Eh)?>'q3hoTMmqA=eD1Oj.Q#nU65PO3K0k5mA!hK"]C\XH4uaXhj0]mUH0 - J#qdPkbWmGit)K6++4fLO1D'(q5Bl#I[_N[@7to)`>(9?*g"nZ.jQ1#q<@\/[m]T\= - 5X>HPa$#J[J^C[@9Cl3n(JuNJG-.I[b\kH^KWd2h*olPWQ4^HbZ[eX0S4g\Q\lm)"YDPVi< - d7MHb^a)&3Gr`';4:-u>!5P)W./@mro"7>trm/^\L*sda;M>gA];HPkkj*G6t' - KY8&fiBR6eZaeaDHFe>+jSj:Y8f!X4>"EOPF/qbS,=/Dgk2MPLVu(1aP:F'r+!ioYK=FYani9`q?P&G4/L_0R - 2dTRHF_7)9q6UEa0(3A3Es^TXim51V)aU]4>FgfKuZ=!4l#"jCrq!NDpGq@cMYZ):9@Cf/^ - M(tcJ1G,4JSI;h9arXd2a1K*(e>%!R]USSD;$%>pmO;h5.]X`B>*\`KeAQ_"hqc3+rIM,N5kC-q(?< - c<7FlaZ7jrPi2*TQ3eKB^+//`)?Ere9DsPN,t`l99.ASuLrqFlAnak14nBr_r'pkMk?Hk8q - +sSu_%g.s1d0k'hmGrlsBXdI'3/l(6ShhS\NJe)rnLmCr785+ga3rT0XP?%*m]?@hS%jm`8 - -m_6a2^#ee?Vsg5om6;QZ2RW%'iUEHeo3WU0?Tmi":Z:08msb'9^BNnP - 8WeF@eI#HoI9"jrl)0uZc$[pd=Y&%.i5rOBmlbMaSYMQNhp+*P_=Y?4r>28pO(IsUApgr&6 - tp6tU0\q=aq)>bq8)qk2u@YI=[/aa3^$4c:&J$.`1;naP?%Gp>s<.K`SC*uPi_j+4UM\d-VYX9^[OC\7);@qkYA`<3o*^ - p)MSs")FDqD]'OCmgiC:h658]DJ!IHRcec2HBpKEL">"a=If?DTblNfWXgH6iZ+h5I5pNh5tYE^s9E:k.Z2^9?EmJ?]D/b`?&bH'&L)*IkEC% - ^5kN]Z7`]1bIrN<=+AAl1l,WO;jc8ts'/l7ctkc/@_5kR - Po]G(?4$l]!Y_/Rk\rjU$"Wp`=$$S(tgXKqpJ.<)?9q'E)+E>1nS"8(b3D]?Fr78dXa&%@] - a<@#NR'WUI`0VecS7e5VLg8slZ!>eBajJ:(uNf,n-`j1PU--YeaSM[k*[*'o=ntTPP]+Z+Y - ,qH8@d61?@9`#])njJ$^cu9]aeP>@\k:k;G%08i?[#G/J8CSo%6W=a/1>Kc'gbA9IoRsVD: - fSel5Y]YM]hMLkj:M2c'(#,%\$<"f:tHE!9./2-h/>eWePrA;*9;-5#T0p7uoGq;#?F?CIeLbuWmFQBh=(BfsS3GOTo= - c:mQZtZC/[P'If"9dVHO]/^oXDOb_=p*2SOIg/^'*IFac7Y7*e'Ye]_iZ"jrq$hhM - Ne=#Ldp`;O$:VfV;JLTfULAT[mB,/-e_bnN3ohVd99b^1udkJ0!j!FG[69$ek*Zre18h`AA - un&=WZVufI+i\Nl]!N?`uEnd9c(4e/C%m,Mk$lJ8WCb6Y@2l:KB&)o*;$gh4\"OdV6"8,hm - gul9t%+u7<`I)Lds/gN4_d.ip9TXiM1[!d&,-4.:&<6=cV[F1_,Z6qeRDchLJHV>qpjmF&0 - h'\`n!iY>A+/tH6RX`,*(1?_X_m4?VC:AtCFtTBMCH;qp@mF>CO4D@;NfjEH81 - =!IT;6Ffl"2ES#Um]eoTFuM4u^NlN9"KmVi]>e1V]:0,30-M4q_R?b1S'b*gEpmP0R%;l"m - RK)eP7RmPM&&)($O9:Qogn-H(1<1#PI&H#j.-bilA)A@-iS')H7`WN=0KI(s1?D,a+BLG^% - 2RZUA4mE:l'q.4&BM1p)?Q,[SGah0'\'@pX2kH'H-6m[P,a^[\MG`.N+9qb$gL.5[_E_=eS - S.ZH[c8iVaNMI5?DBoZWCiJCJ[=u+2o8`Y`nDfgO`:=XgdAlTSC1 - >\G>`WB9iPm_cbAqEoqI7>R-ctUm]M,[!a;X*:U;.Ci9T/Q.rNI]C,=iB#H,33+i]_Gk - h`gh"H+VUdB%==U(PC7Ikap.h8(\eeahKdi4hb/RL"a^!9-NMpj5rlFBlB5.;)JXL+$Xh7U3Z - ^)@tMD2fC(U07bWX7j*TPTNA04[6/nrkd;,%qBE]Og-fFa4YeeAo.F:[!$?9g)Et)D-aESp - =@gLRqHX+]tLq"#34J8QZ6n[agq.Hl.qi(GAb+O]6B#$hHSTVmsXH72n&P>S*tiFXoYj]0' - 9eb)c.A'%tDp.ln9'In_^\@+]bT&EOkT%X[(i\N.m\,p;Z-]B6A6#.ASfP+Ng - 3UFRkG\a0ld8`nACtE_Ng;F!i'WHnQphrc?,)2I5I8bFS#q@E!J?N9IhPUMO8#SpA%`l+/7 - ?o0.fK[g,p_>Bch5mNKD-cRIrQpR:cX^"E.A9Br(;UNA\fg:C?akaf>`G0X1E\sI!lrP+KZ - DPO#>`cLI9CS5n>dC=QWC[Rb6\*@GMWXt2kf2em[CKC[)ToFAkF7g.2Il_"2.J<=G.Ykq)r - EehQ*4,@-i6LRUC8H>%S!8qu;Hk@,/g%AnSuUYfBcAC82nuF>Y+"Y8R;6#lI^=3igKIf3nn - f,Eq3Df(>;(l\Ffg1F[bARNYH@-WQ*[F?fBtr*0ro+a6DF/Hg-HZpo_r46Y?(8]IdbJX4[Q - EE'RS[f;r9gN`%7\B5.]]<)sX3`d(\i75O$O%LH3>VDf(INe9>57Af'/0_h1Ei/-VT - aKSP,.bZRn\33$_;j]&]I>G\'uCjU/9Ea"9FX<6*=A:rWa]I%RIIshX1r,X5r-KKMEaD#c, - .; - ??2abeK)uMt=lqo2W4"A_B`Bq>Xgdsn-@m4^<-6,(^"A$KgAOVgq`M1jO'PKs(Bgh<&7/T- - I@`6!>BZ5PVXNXPZ1iKG5F2M7&SNLr2Uan_V3PWL:_3B,ZHiH@L4iF^Q`,n5\4ERPhiXf5@ - 4[^Zc_ob/0()%)K,u[pE$nT*Wm(EH>W2)19$f`Xd?pb'Q5R\p?8^\pO2T*H^`Tu5Alse!D< - 6,Dm7t^$GPYf*lFi4D_7KcBu;DUK&H_bFScm6IIKa)k8&48 - Qt(Pfa\<6Y&qU!hII0ZGio,-o=iB,cA]4AkLio`d4+"r*;l>QUk)T7W[cc7']FT"MjPNb62 - P&'Wieu[ju977b#%>jLd$sIS#K&6W?TLoVY?p\]=oLXn5YUAAfsFYfp>f_+]E"Mq10&jV$S?#Uq@H[\WINWXJJ>H-W - 2cs8kVa?p*2;k:NZ[I<3A^-OADkFcb0V1>\BC2R1XG,cA_592!RlDrm2pM:c/,I6AZl8\KS - nDaU45/=TZS%+OMI)WEB>N>oB\2`_aT$:F(6^eHaBZ'$nG$cNP-u%3,]P6HZ$Q*CUK+A+.[ - =*l5FTdYmZ_$,+b]/&dI_d'Chi>lRXLjANB=9N9>2bm6rng!(.4:.4Nm17D+r=jd0lcW'q@ - eIU+KJP(Kc:>IGK%4=Uc+sGJVc.XqO,Vi)mPS#EN(J'r.f[:Hc(E*"i<9U%*WZI4l;&(nO/ - ZDnsZne4h$GA.n_"o.H+g]Lnnu.Nma'?k)m9.`R69N-)e]d8P=fPKh>!7[u;<4.)eR9"GX: - qEO;_k[B,l%`$6CKH2jHFWrs`!P[Z;dga&n_1kuJ&_mO.:/'a"D8 - Y,1GZHDDYW2mZI.HXLtm-ih!N6hATZ]b)H)h9L`O_gh8B]oB&-2-g3( - A>c+@3tTNn&N>t(a+J^)Q!A - ]rcR*b7NAR\R]rk6Z]CCi&6WF$k8=B(g&i5%LZUHE@Bo=VVrX"QebmC1ieG8nN<[I7GQKGA - #0p_<*k8LE/Nj!/PoK'B'sJ8g4*d9"]JANM2#q^mV: - D&=D5AgB[d:M/W"/[HJ(3+fg^i`??bQeHYFgf"ZDf`eo;PhQU)NEksg,9SpG(9HYQi0QYb73D'$MK?H__B`9e&sm@NM.Y3@pke8>YpD8+j^`pE.(bj7O]m,l - E-/$!Relu&unD.C$C(@PM`\ZhDdO@OcMMV5B'trs*!LiNL]9kdobc?rh[L - E[FT5,/0S4F39'[CNFE^4I:KV`E=7lf$:$o&G2c5Em;Uk_Kog`2.5kaFUcjfGDFf9ob=(6< - cG4iqLFgk`NLKWA==8!)nE"4O5F^_'= - :M9A[GkMA_=uE7&+*7/mI.pu^pMtu\GBJ)TCj24IF_=j$2hH8jJG7Z1C&q$'#CZAKM"jc#f - ^F!?%t&SnFEj.0p\/b'LNWCDC%nf3pV2da?XJ$?P%fu5Gh7WDB5@9$MhkGnq%&s;&!)"6PP - Cblq;HGkSrWW=DtoZ]GK,R7\"3@KT6[XD:U#-$Mu/!mqBobILU;:*]6dnFH&m` - *5@&S2S,/1tqV1*.=(FFF\_@:dW4ftWJ>cVN"r@ - F$!TIXR"ZQerIsBmt8s976@1BBj7[Y#,D)IP,UKkHU#uj_%BZ(K]G#RSZkX_?1iL - PCUk^K_hkc^&'!!3'!JO&-i80e*K$A:]ROEcEg(CZ/>@Zb?B(*%jX6)2ik9NiAWLVfgKW5N - :H$\q101AK?c6S+8B,S54%[OW_jc=PB@S6eMG41o]iF^`t^+rW(`DbnZb7m/58]4bLc'Hblg8_5*Sd34_* - +!g%,0%IO6sF>j0oA2DQC)4"9Ro##dYk!n`X]@NmkF--52@jtFB9L&ETE4\`i+hIXK"$ - [G8SB(MNK)H;7idd\?_?_.SA-pNjHFaKLmdemQs7HbR<`((!*XRbe1Ft,&E[lWK``*c7N"0 - *6RZePoqg1gNaZ3MlYSe^_6;H3D`XZS>IWS'TG8rb9[<-:@nrf,Yq9*d3q_RPeSg!dHrGK9 - FZ+Yp=&[2VOG'&eO`-YnsnZ=82!q,-d&f5:6popZmo<[ - APr=;FOY82tY7+(.pOSMLf'(%f7\2DE+VB-MA5RoIrSAMVq;Fr^p=B1X_e5-emhhb;K-4>S^(e+[WAQ_E)#7Wr'^ZG/IO-8`NNeA"!oVgSYJMtPJIaGH0R,_0MrQ1]5*]j - 0-S,4>Gn&i(;0U8,eC([j@,"I6R"6%2BS]&HS,1+\i&>Li4JaV'tCel;uL2iDaR:kmlQQ+\ - nkP5EOW'3M[>Tj>VrM*73%M;j_&tlqm#28%cPQEb`93D:V'ta+'lThK>=Jo6aJt`[cF\1$EJg"s:K-N(/ - _/neg6Rme#B9Ml^cd+-RL[>uf]'mb9,"H[Ecsn1Ff.@%/mfEbVB43(%l^hq?.s:JoFmf(eU - '@t/"7g%W/A@&DaYGCQgI"?>#mp/V"^1+r[A.`C]=>g*P$7XbTR[trb*$eg*V&LPHHcCB7.*n_(Y?6Mr"&.tjg$$bBFOi8N_]2 - @m)(OlU]fiac>HYS"Z:#fciN$2$LG)#,pCP_,G$IVB%E5;dVQCPp9s?g[\U7RsOlgAH;,c! - El]#lc)JbVk.eSXRO-g8c=Eg4fo?*3"$/*?qNYGu@qP/a1i5U+DRfl2B$qEXL;>Rdb\P67b - 3!cNKhS=C*];j>k=N%c#NHGHm`8bUA.*h:-=\dD@T\-OQ.`oAtV.Oh[JT,Y))[sl7k; - 3!bCQ4S?jBHbpQ-uk%rk2dfLsjGaBp,/%^TNV:a)(HO-KiU-+Pb2++;U.qUknL%,?"`&20n - ,0\u;;+=8U6Q!">Z\Xl&rVOLrb:Ur\\Y8P.ELhCn)rWS,E%km='%r6\VaK44Y.33+g,@c"o - WXrDWa[-NI1rHqBVk0dAj(7@/YF+1*e/V>ZoI?Oq(Y7tf0gg5.ML*@B_(93IKq - 5DVDc(75s/A=]W/rc1:PhLKC4i0nEtT!^oVj=gK^P\"mXro51I!Cs]WO'm9[Xcg?Y4^UI'5 - .\?a^V33M!7'4QF)'YN=8r+6sVo^aZBWQlOZLj:5TW6)P.$]3@Daj5 - #V`OH^j^;X7Lne0&:3EWY[\:*d!n)F07qE[hSFWPD>ZsCi/5tb!p(`nD`b&QA90K?F2.Xt# - JTE<"'Y5"4J>#Q1H>T`H]+qE;n_)!-N,bV9:]?:jXmYmSp"GWc"\R6BtSXf]%cL#, - 8fLaUXGNnF^Fg68!0(*.\ePU4E'=r:/lb^ikEbIbh>IWm=Psh[Xda1I;;44rVM/O@FFc4`P=oVS*?j4OS^WQMUnZM6*97_SeC$Q[ - e#cQKogZ&6%-$%fb\rqh#$oV9%3smA%qW&S4gd>qPif(LnZd4eGWI`#AkY@I1Vn:[)7Rb$q.iHrbRkCbieCt^2*aT6'N-84`f@gmR)NCMop83bJb=^!sXJ#$]onV.GX[M>Gc( - 1buf2[*C#i^9]M"3tk_,t:'`3'!BhL(X1Rs0HoV4YA:cG60p?:/UIMkKgNJ):Ln>B.m5`O> - Ijg`/C;n3"6jWEo\[]N4Q=L+/Xth^HU6Mj;kNQXm.X*C_g8kOW"=[E3nWtW - eHb#.bBfEgfk5skZ-^o$m57/+"?9^ - ,H"B+D]#j)f[:Aji5_lgVR-G,ZF3c1=cX"8'F(6rEd715?R;1hS'^`??cmY^&4F1?R.J%>^ - j4fdXpCb[oA6+eUL,>34ZAi&*eVjcDchDc#Hmd=UXo;m?OsiR^%DDn=E(L40CBe`V!)RY=n:_/[PmK-s#k1Opn3I@7R0lc]$*\a`cpmlT(e@:>5D>!bm6Ha9" - HZCn`IgYMON9Kp`j>&I[&@Y^OQ82*9a\,"%hNdiE:j_qpCGXJ&.nXK;#_)H!t^S*&CD.&Yn - mua)%f^b&eQ2u;&p:3,8.7/'%&KK&N:?m3tkIS'9PKn;*u%[5nq^:'_+g2&Q]]E>88l"'p2 - o>d:3rSB,8m+(D1F!0P:d3(CUl7n>eOtE8:rlf*sG!6&dT-bq>?&FV^(<#8%7KE&@aF3sY; - L'bR>O&>9?UN>lj*)mQ.VOG=fQ_]&$6)_o#3&\S]p[0X%\)H#$'&@Df6h$S/\&2DK1;<[oI - m0Aci*O4]61'&H"_ZgYe*Kfq9;>22qq]O7&*>(pd:i@@.=Wm3P+-8,p;BZD<.in0u)U]]IE - &SrER3HZC*tRNVdLdc\"!"St-*dn&dQ&M7,p@:`,d:,lE'G[)<@796,;OBe;I:S%boZDU'C - p>q&p#5E?PfHc([W^jD[=h>M",=H(upABCFHO:RZT1(eP0=#'#uOp*p?';Pn*0JDXd%gk#F - !Tj3F+*bFG=;M(NR\mj1Z[c@"GB*_hZ#02g6c7EFdI$s/):mqhuFkj'ng^>"R"0TP5HP0iE - V+OKMuhJP`Qo.7#B'e_/Imm[%)m"4D6)_p]JmOfe>bbBq-2)K1f\FVuEo/P#O,_/fr0M3JO - a7@.>AA7Y41UCK27T-=*'Xs+"f&m6sEt[V6CGf%"]$(sDDS8%D5<+joa7C(C;];WulSa]C1 - XbF>;\7??Z@telRa.qiY2JG`D!^b(maJp4;j0;Fd-C4SdS);VC8c@Bj#HJZj&7ftWoh,+b< - L'Dj--H-'/MZXao=Zi!s"0H;6*l%''2q4GbWu?dL+F7oXo@.9ilA4B0'q6jN$ - G9d82r%PGr$5`L%NF%Jt<.5t2A3)!O3PN+sr,$/YcbOh+QldY/TGrG;O9(&$'mZ-I'm5&Du - ^GDK;F;jES@npn\1obms;Ya*F3pTbI26Q0"'<<^`HoA%Q9l-doX9@PtU4'-PfMmu01uV8Jd - nmEgd8Pli2).LA5ipI]5]iJLZ_:0[7l\[p6LrGuPH`i&=Z_ht9hgSfd(*!&LJ2i);/<2XC7 - /#&\hj!59!fr#V8TK3:!LSi"2\1u12-+$nGp58D - :"B\-8-G?,Hb6PPe`'):HDHL>:`8@$c:p!l`9B3Hq00>IT;j&ngopF:sg(i\"7Oc6V`2b+W - ")3uL;NCudgk=A62P)U0ZoFersY`6r`RhW*"9WF\j9j]_,U,?FWmDD[U:t1NKg'<4I!L\?1Ym8_.eDomiWVSNSj>:A*"$'hmVIaPf%81DQNp[Zaq(8AR2e;(V.8l - [(gSg<[(_Rh_hWp,>OnF[VLMCWN2c#[M&mAF)tePtH)`%Kg:LR::%uB9oqa/!do8cTG75A! - 8K_WeF.^M,G(1Rh_&rY.%)h2fNm'2lM4=23+#gq.!!iA6,B\QB+jBk>TLsD73L,%R"Ohs$: - h(`j[=;(5$JTa^8)n<7X=Y(@>op[;,G+8kfb7pFOo3^N1n!F=n"f;i=r4JTUR4`"ps9p&_L - b"\"$C51c?Nd)08W/R^O^7[>!&(*=A\_^a4aP#R!B&V3JPpMK3WDCPjk2X+>Q"I>BW;"o`N - X>b?G^M%e3H$4C,[1uq)q/KJSIeT+PecUDG;f-04GUFSP'.YpVG+?$$hNutm(KXU\bic%bS - 4l(eGRJOo%t^##a]Da)[p`3;+Z":h_Nr/ZpMj+(?\!:X8M&\Me2_60)1HeYA'ETTFdHEka( - j)L1"K,npZlg:%q_0`W?fAn2`kVg#)jAu5hHlmY5*]FFbJ>DF]4?Q[,3]""cBc4:_f[YFjk - f^*H[MDAN4+@(cus8fmXa"I.h8q=(?ZF4]p?$:KY-o(>s#[jaD=#_H'rtfMt.;j``[iMt_J - P[Y]5EG@5TXH?[J>(Ti&8'h?Wu7l%JA196Sd]jd/AfJn:1L96\T1GI#[B/hYYQMb(NqirL/ - PfA?;XL4>bb[S#aPm0(s3F\3d)jct"N=(9U1aSJ8<*XMD:"ai\\UTr9OZg70a*EPQ=_qWHH - K1gmRANGNmVeJLi*(E*R5q@i\ZqO@E)\15=ZN9cFb?27>[JA!?$X_\<@Co$Z^_58S_7;<3K - @[+A"0I6S)t$JXM(2#pRK5A>NO7uL,GRu=dh@aTZ)"l'[`>:b3<'#K),E*jXm-,kj>r3Sd` - (%RJiiU!Mc(9UY/gT3^Z-bqiP%IU=kR7RKki66(Z?X?+JFY).B?[*+8UNVE)jr\`[.M3MuY - "Fuk2NRH'tT$sboHRp'Hs)C8&HEMGTc7bc*M[El1h[:.g:^"Y-Hqah9bK>)t$NuQcXQd0d - -K/3<]]pT:MRtC/L=1T=TTf)SZ"3$UC-c)9:_&D^X'mIIj!ObI/]PZKB)n+kqA=P`l^,s/e - f)rW'rj4V]]u"ikMaMg')cK^K1.ngQfKutCC@V]&86)JTgjh08JCN`U2oR=S9fpGXOiauhW - G"'4AhD/A.RY2KPUqC-c@S#JLf/t;QDjZ1S?'k,T:qd@\=B0B4H[fJY3gVOc$["C`T166N8 - HascRKHYSiQKJLFr[65I*'R%igP8Z`#SVW,WX15\^,RHc@#`@]\1[AF3P"mc!8:o*2C - qF%Fa,*bl&:'SI*_-"FpAAceSuY*3mrj;pua5ar2If>uB!e6d'kpe6OHR>n>-sFig1_d+oe - oKN$1p)9]]mB,VUpSR'p>*CDtWUE)5ErEn2^ggltFesuoo>u/k]?eF26fj/[QI@Ja"\&r!g - gDtdq*8f>\Ok;ghWnk5@IGN6JWaC0Yh7^MDrU&Gk^"j_#be2]erPd7`n^j=+h#6B?FBGP_" - S`S>!&@CT_WYlD.i]T^#>uN"nr!ACM``5PaGjMCn*MB?)rhu2+u2M6Sl7(%.0@4\-o.8:nn - [>nB*&!)&RJ6\P*$E@:AV81&Unlbr`SEiJ*6fNiSIi:Z])%$hHT2qB(86hidoP1%KgP*riA2hjNdP[HE%E+9'acT+C`>U\d9GpqOlBI_G[:_t$].nt - -*W^YSEe\b7,%$QnEm^S1XV^&ET`s*oPA:e2QI$OMI%Tl;DJ)BfHD_r=NqA.gO2LIC,V32D - !`'p(nY&ia]b0cQ:sACASAY$i$'aQ(_ECnbo,SB@^,WLV[n4+trDF3+jUDb6VM..h7+5*\+ - +`b:N\]eZEMX2:oZ.^a$-,d5jsonna#4'])?V"Iq$U1%r,g1hE#[6E[[Af7DL.)[l"H\Z"u - O7WVX7>6e2@sEh/._1GW@PX>+Fu'@>!+g)ZN8?o`CsV;6fDNWE8#F^Hoe8O0^'fGAm.B$!G - 106T_IYVENV:sKU##-\=ktFFD850$34XH-',R(no_Eo2n;pHQtCUB*StP1]rQcbm?F5u!">s1E/@OT< - 6o42hRkXtt7T_D'`0$9mtG*t6)+g_g>ZYB2W*^6*5*pVeg+-O[ere6`q\X_^Vr`9oFL)np: - P)]^re/7T42EX[3ra3hhp,Y!mu\L#C:>bDre5X^=)ALmRGTWLu?5#<$*O4&d2J>7^%cs - ,>3*2me=,+A>M?2;nU3?9[i'P*6iQCY:r5(Pas)BoG$+Jb]EFJ3`/eO,kB5[)lV+NcQtWu; - RGO%6SoF.o1cu^A,a:h'l<"406N)q=i/BG6!,^=*#R2&YL>@:1=3@bgXo)'G/W"5o=J5>/q - cA";U%R?A4&2]B5CU>/[U)[:n(Tj[p!#oV9s,82d.;D>7h6%FZF<0e;dlP`S# - [r(N]t&?.ZLE='bP`]78Vfed[=6NE+'ShR2bnJ"g%O%sHtLjrE\p26D4W@2I3&MW@k,0p(6 - dNSAehLkZk-jr$>8K#dZZ`7qc12E-TXR>,Erj-Yi1M*GhYLhYV!$H$ - Q$MWg(-ashH2ae-BfY$=Rd2quW:0)!?GiAq>`m.qd"V/"^b08j>/G2]B:)lE57mal(.# - [WrGa1Z)t*l47Z\+[MRja38fQZ*na)6<7qf+5F_]6?!An_2!B^2ePfCUIXLDDeY&r&2+2kh - KMIcus\0+e,[(Ntp".I:#pdA36B&b'%$>0A:92G>$5+]4V;oGT;HTfD(n$NR7(,:1<8T?>m - %1p:cQbVg)Lm>I==!g'OdM1aT`]Go4ne9)AkVm1*e=a<7rI)cAAPAQ)Z)fYuW'9&Xi19p*cu-SE9.k:#h'b4jB - mnO#tIM]%*IQ"VG"3,pW*Ve)3i@'HkK=IaGB-Sj17[?12]-B#cB+]'CV/_l8$I1:B4qdWEC - su9ZYkg*7f]7Ocl;4auO^M,kSW9ENWD:_q-RgUh#`h,uR6IN>tu@[SASeKDe\fpAPNp9,iidESs*:BcFEC&js9AX;gr5t - 'SR&FKN+QWc>LuHq(n:>V3Ha-BsH@:UEkH3J2.1]_^BPFe0167B+cFd\a'jdeAG#O<@XrWk - 8TNB5GW8[BLJenQ405T1/To4a>sg$esp$7OsZkkPXM0XqUStpP)IcPmZEW+5*p?U8CQ:0:Z - fVgQ1UBC`<59e-LD#%b#5988lZqaI!nZT_C2cpNBo!u;Q7&e6rlpd6I^++VN7I[`l]#UhP, - -MoHnQ',rD3o>A13]1Tj6l1ri/RK;V'S5(9>E%Y]K5Q=]j9PC[He7p/8%ob:d>&I>k/ - V2Si2d6#%p82QuC892PJnA^i$,Z8>lg<[r/K.kS(t.7Vh=X%PWm?#d-X_TuAQU7#f9S==@Z - doHj=E8B<0W-4WHeuM;M/hLG1G+i^()jb=Q7GG@1,'?rNd44FX8$uEags2B?iGO@dN`3OS> - ?]'WkcGDZp.jf,g7'e!23O\6-N[H(;0Hk5\u>A?%b@[k@[2=BZuguVdi(l5DJ`(WlB;*DaH - &`#,qu0q"shZtB8[TqrN+P`h:Ht&<%NajW0]qI@]O!oD?X4-fW,q<97LU@ee(*U1;dPe*AM - RC9;ac'p/,MLCU/Y<[g,5`?V$M>nkM6X(P9.eCk\*o-$>jtdk;g@_)l<^iOZF<*a^I1G2eTR8X+C>h9U,``'YcG9geDrK2!JTun7r!FX^%T5q=sM&BqlA"4iVEg9bK - WM_L_H_%%@9ZtQS@\@,^k@a6Pc<>N8b[C9%'"!t*\lsj>j=L_;Fd:G$)NRm/W=Q/85&/,OK - 4!P`pSrAM`4Hm+&*;W2Jo=u%Z8g04Ao16X.#g[D3IbW)>cXB8rf,/@mr0bX$)d?+Y0T29F6 - +toXZ"a[e?pZJY(\N`9B7obE;Net%"37Q(2ldSV'FuEMo)`J.uG8%eEP`H`3i'm`I$'Um!U - 7bGKoj=G-K*TmH9o22SnIC1O!eDe&_=&9]K>5P]H\W[nT=rd!J\RCom;YGXe"SgoHWU/.p1 - 9h`TWi"#9A<1XPQ&7F(iRCKR0>deTcqcoR^Bm_1isHD]c:g0\K\X]a-&#@,uo6V:fOXf],e - 2Q:oL@;h.!(OB(TfNjP[EdlcU\ef>?e(3JrNn(:Z#)_g(s/bu1=5`a!L"O*]Mtim5i%TA7c - X%9Fq&\5943qj8GlQ!)^;mb]mcF'>/$eJ9c^T=5K_(`6e9&uEe%KC7p"GV@i,9p'3kg.;GL - *Mc+"P(9AK[bX@bY=d:PUA]o\c5MKC<,taF9#i1mi7bZCAAik;3:"Dsp\NNrAKs%X%)Xc`) - 8sX.M2W`:goLU2PN'VLCGUg3nn+G/%VXrCc`>b(VjmQPPe5Tc:VWS):aR!4t$>,-0=k@m.R - m!'gAU]aM?\bQkn_JO#Dn]USK-Zh)!(oY;ts5Wc!Yo@c4+$`_?V5q=i1"%56[$:.Ul5ng@d - EkJdMMDYK\3^^'a"9q$$s$<_/[OYC[)R2U2CF\r)_B]:@S/]+Mi0'R<^JgahF=4_s&Af+>5 - U7hp1Qsug)FB)R6Bfe`U8L?e-GSm;6ED$.^qN@OMh&6nE3fpS\Vtd0M=aH!W2to99FJq=`2#sme47H!;8ihE#p`>9&>; - Mq:;j53`Gh7R:p3:Z<^f\a7;/:3<*7,M\HueP`H5S-S6JFX@#Lg]7Nl< - ^"DGe?Z:4\$$\Vj)UgZ_tBZ7niN=``lr+e`kE5hH\7FYpjp1i13#DT@-F - `11\b'O/NJGfRa#7\"]n]Q-MYC;rqea;e1"ppruVJOdq;`h[oO34m2KF[j<(`e8k5,`'H&H - Gn$`8*kfJE3[HBI#=GS8JGdY1jR(4Db"&X8CWdC/5sYaQcWKm7Wb'?,auhkKup-Va^D9mr* - r9fDof#F#rGjXjIF?aJK][-3P0d?&:u)^kI>Qc5*8L$U[9ujlT]WY3,@_;'IPk>Wg1Mt8lW - .?1pkBkZqFZ394YNTFL]M1\]]Z;99d$2`4O4B]1_4tbNupcoYAZR_9;bnbS7rg,f@i*`6;c - 19Q\7tI)aB`aip!lb`'`hUs)N>bfo.mbk0.S"O>7#ccm/0Ye7g[`1k9TR7Q+,MPPtsZq\Ya - Qq^i6bp9#S]X^TBfZg5,8fWf7o\@OSPYI[U:&NkkguHI4TZEAV8Ap;qD"k0Dlo4H=3!f+J\ro[s9"q+#ZE1?(U8U]57R;o_;C[F8l4'm - W(8,1<6nBLgj=i0lmmL+P3eR2q9>a"6NNe'fd`Vtc>X6.'4LN)Z_TY,&g]c,OBN!T=^s\d] - oFo+\^Ja\C6eiYK9JXEDT2UCO;a[NOKf,YFjuaA-6%q>h/`hd^*Q7eQ>`0W'Pbt<(&Xpoea/>>?'?=VYE9NT&_\g/!@9jh&E,o>jR - =-\.ul`D,,rB4.N.`U8]+1Vg+)REm?uXU5 - hORM=Q*3sAS4%t'L5BU<0@D>]rP4=bh!Lde)dGc[9:ASV*[n;_s&II;jGopFI:=V=N[So.V - lR@XP:Fmf$OV),V'q,1L&$IgU0p`_5^MK^c`r(g+sULD(`aqG?djb>[`n"_q6aSW7.OR+;J - WhKkjp&Vk1lQ>LfP*!6SQ)"?T%d4Pe8sm?:e??!11Me9t:8/MtBDOMB%c>N>N?HhprNH<&u - W5"uqZ?&1[\WBY4%[GC"*1our7*`s_5b4UMA;i**>M--Uu/aJP/64Hrn[Ts:S>:%!g6f)*+ - OkcL$h6fm\mFkQBPZr8b6=o\tM_Q/f_d@8J>OmeW&O[Ii7QiW(e@j0IQ.4IB6JQER&.RX8* - Wt;c"[5B.YqA'iKTjY4XeP - 0qn[B2 - Sa7@J4ZMip+.Q?f#Qa*G.Rt7Ijp56e#_!?X%&$fresVR:^>gi;MEiL3hm??n4*;=f!KLXq2 - rRGZimKB20b?/`G^/"l*]G%q\"2L*^=.?T[*__/:"P2L+4VH03)7f1q-7VO6IOIct1d[2s2 - Bp+b]AF_D5pA6P#9Boj2Y)\"DofMnnXY"Xki:KT5DC5%C+c%e#h]&a]*Z%Z"*=q-Y?Eas\Q - .P@P.5$6Egg+:nrlQXf^.5U9f#O3?'/2jse%K0R:D/11s=#:.e)P7K8Gj.tl07(F)2Rhklb - N.g%S)N4&St^#e1Z.#YCjs21T#,!39453BCR2_IiclK[$#J1M@K)@)_%gcb&*l8Z&sgCIrk - gB)ce8lDh.F+_,Q$e06Ef>>m9@;pJPG8X+"Q3fm*: - /mG$MP;>fjJg@#OFCVc[oA>Y5>RVDi>Q>Pb!p@W:74mhcL,KbLND1jg+/.j-!ZZ?g_ZpnCh - @o=LkjT0.j!NW.bSK,cA*V'>L$aM+JeRZp#pO@WnX9(?WQQ9=M4J8t+\*RrW - ?n#5,B7`#nf!0(q?S29nT!ecnm<*&:FC00a;_T/+\p[1[hbRh"7P($ng>iYM?k1J,7mp,nr - `fhmi1fk(imYGSC\LKZ20r!&G(r1VnY'/T0%(s*$:e9+M$_XmlBql+&n?.oHFN]hd?$M@.oEKG+TS\ - :Bk8D92W8DdKHeLUPQ][IkZT?1];jo",h.3&b@gJo4/n-M\,Tm/QQ&^'5B.DF'W"*I?P&Q5 - ,uCEVh"1Za!dP_pX5,!dt?oMoQY60CP(XBN3$pJ1@I4aG^#(O-\-HmQh]`q&/P;ni^/lbOl - 9B)oRDqYO')upId@6>F2sY(LQ;.*Q=>+mGPXFH[TD6]7GWLfZhl1F!Wd8Te9&GgG7tZ)h@XAWM'VAn1/j4Ol.D_G2A_Q@7!BmHh[=IF-47r("n,AFRuOjF#J9 - r:$u=KaZ3kc:b8H9pFT6r.Rnar_Y&eI12\EYLq2De9rFj;+uXj]SHGk!drn[IHT,-&)5J2g - ;^&BMX:Fn8&kL?i^h,M8W7dh71&q[%=MmMa`Q/5s6G-A#LQW(r\*5-+77EVk>7N*rV+fk(\ - 7Q2"\M;<:J]ckJ)1($p4#4@s%hk*hr]>g`R+Y^a9[;\hr"bS&dJSn6/bXRA0r6#LVi#sW0B - U^'o0e.!@)*(:.PRea4&sorb&YXBMU3)`=Y!FJRUX - (:lBWj__G+/p;U/6M591@-omG/Vb'ZaAB,5WjY,2KWesjGrsk%.@8$90%mkc)gb0p6sYOgQM_[cQF%PU`N^D+Tte+FJ9%nob)43rjdi5Db - 1?Osm`1^<#,Z*YSm][0ShrBtDU/DNba>@R6EO6i8ZaYAIH+hUA\>mn^c%"tV&YACHm7hXV! - *^I&Im53$b][m?NP@Vuk9bm=B3n$>M'YgAS!0Q_E2A\Q>N=-=E]\'?)ua>^&o/8R3+6eT+T2'gm - .KQ[S78=LU/EGZu!?`Gf)u]le^/F`m_5?C3nkI,7r4YC^2,NWXrB\8D2!@X*%'Mdj38Xbp; - ,N]BmF3#2s]j0]@iOBm+e_3AG2%Uk=U))]a$jEGcaLXl.M2jNMbp%ss03Se29BU93[UK6'F - I?Ec]AnRWG\RnjAC&2-2UguG[[@kon*^d-qRc^HBm$cbr@aQW>?LWIOG2b;qCKeNtTd4%`; - _V05K*Kb^CDA@hcm\%oW_R9llp3_*>Ta3?l7REd,p+aj\/NF6 - nBNeF[$"7Xt'd(Lbqh-sop-oc;@jLo6g48_J=Dk<%I?CKFT\FhS*0JTor-PMGrIO)a>,So9 - 8CHC]8VkV+&B#)i?7?YAp&^<_Z-ak^TsYl$\_alWD,8%8\0grr/R3`e*V56U/8t:BIW+a'WQ4p@U&D:7nJCG9XOeNAja" - [:0&/n'#'X+oDsfQk&!gK%!^l5>CWqe`>+RHHO=#_OA8A+-3jrX-WGDVe!30XH/C_mm-HrT - Ph%f3n5j,Q9L+f5E(S,<394:tT4]?i:C1)@Tc8QUF+#]:)"U'<[-p2#&]2q!*e`f7Y;j07VI#4XjZ?%s^*DmnP&Y>1AHVrM'*@Xk%T9W`deLGH/lK&_Oe[eo3<8C - %leSg^pU8LtJTj=^q7\5>qUt5s?5UZeaWmr/ZdX(RK'"pW1'i%:agF#PXPkV$J;S,deThm: - '0XCAk^XkP+A*iSY:R6U=];kI:'BOtUp"$G&U=ip+D-F(Gq9r!u?CdRe_QVEX@jd\*2%M/A - E>KnKS4e\!mO:)^FXD#C`-HIkqF%bE62i92ph2*LM6GL3O<-ne?u1/'86#r]h:+K6,iToS` - F.N=b%,[VfnD&DXO3oF6"Q+Z!NWX\_Gu7JE%cU+1\^eO-ff>$J]Z:\GFIUO57r07%ZWFd!2-.NsUR7OiDFdf/9;WJE#"W4uDogYL - ##N,T3&U0."&@0H=N0If9%Gr$)em#bTE<cXDaIVD;Dk^ps7DisRk - '0P4b,Vu#j+>JZ9i<`Qla#5hl1=,.1o0$!e"+Mo[bM(c#;c^B68kDD9mZ_g"1-JLXXl4o$9 - $"_(9B-$0)eW@([G0!ifp1.uXTkN;QZ8bo,jQO"9'/kWgRO9??KIa'f7?Y<]6Vusq?'o`@q - S_(=/3t9)Y]JBQ7%3ubBC^*s>C&P2P6A0sK[4^:NQ6(K1EIg2lSUNpgm2/qna8qf\[HtN2d - 7Y5PhW+ZEMD'^RChOe7kcG!kZ=sL]e"nsK:c8l1@?K/0'boZu9R^4 - m9S@kP'el>7Bo.d+*HKYmj'@h2g;^96(`3U50hMH(ekq-D`q&u6d`f\m%GMT$nAru,e+.)? - ]B?>AfgZ&rSJT!A>]lY=i`&UJFClSmQpNJrE4VN*M9Y%>`?Gu)aMl1Y&[DXPu).]m-WNKRDZ2n606%p(!uF2En\s*eS%p%7eaNcV - Na`Ictr;\(Q('PIeJL;X`JWg\pS@kP`lO>/*M?Z]2[J>>1C=.>tXD"jPd@Gqe%ghnGtBg>% - %-CH5bFq*+Jpni]:jjIYgb]-jrN*nR+RIML82Sn)sB]=W6l"'P7Es^%K!YC1YU435^FRq-?n&*T7:EJXP2WW1A!\\N?n3ZT*P^cN6hiQ^>Y^ - $V[%bVCB#r!pnYaGsI:=2m9i==l:0L54?:CT_4%kNV6O4`DC;[uR`p/$k]d0Bf:$MA@j$ZL - jcOGaA33p)M,UCIq3OIHVR>7(r?'WhrU&0DMp1C)0rDPPANL?uEgYdjn0qe;;ll&njj+Pb; - M^sO]Q$*tMKGajhd)@tQ/UH4:9CtPif'/(KA8ECR:dRNWu&n80cc&!)'ZOr;kMGX*C9Yfns - bXh9Fb43]5@*jO.Z&E*b/N=KiI">ToiX7HrskX4n"^FDRj: - )OP#k94fH*NlpUdKiL)bdA"%&-L`-YN[-'.0`WY,HT$a:L>2[[0In,,``;am[GGX+!kmD,* - :P&-\VYa`?pa,+U%fh/Pt:9cR3`"*Didal>[o)jM0,+-&:_2&O@c7=WrrgnM(t4&764$""( - 9W*psU^/Dfh-[aGdC.?:jRP#EjS9WU"lrXXK%;(EkHJM!%bFg'IIEci?UZRsV:8$_S(<, - ,s"B@O0@I6^%R0ltf.`@0-uKV:ZAd2:?NIH4.e;rZXamm_U,nE]qU(>5c,ghT=SmbO(_]h) - jPr(8`gVt6/^n2,cdF44ZRsE>($^a>W@3sE9(VWaIuG_=$#5L+M)'#_[YYidaXJs(R5ZgUQ - H;siBeF98.iYHkNp0l%:>4jZ*/:G1P%W]u;hFaWaZ.bW3O8<;')%R=G`t[:3R`%1&P5#^h` - I%QP-agEe&+,Nj$,?S.PRVZ1Uf:7!BK0T3sbXG#X(@IlTU-Z51B@\ZZ/;''00!h6;i-lF-* - \a,rq2=5kF/*o63NBVN>l26`\ZqBm>rmZTPFP7'p5ZZ^-o!7jQ2iNRSh5oMnDfWri[/7*.k - _no74#'0c&N4EH!A&@Xdc/Ncu%8TY&*b&L!02(;M&3n+Bt'FKlm.W^gIJi'T#1cIR^"Vrqu - 7nA>(oPX'GAO_fY9XL2?PG:g9i073I2cKNAFEL"d3DO\^:UJ/6o8b&:'h5RB9=,]>F5l1bGaEdn'?jK,Cf(;_>IW;em?aFS$or<$n>B2+23092tRS<>A5.2-Eq%>uam5=#Fhr;` - ZiFg##W[9M1l>P5s?29B)=@MSoQVM]-N - TjfoDCUOCMQ8`>4:Ln%NAL>H.`4G$/@1F(\McBEgk9[?kLFKj*%ZB6G)'L - =Kloq@C@d*LMG]V,Rb/Vo^f6,ILB;,Q[=3``9>>_G - *i.f2upCri3sO0Iju+YEH9VHKmWQjJ[c55GEI@bK6`fC)f&f5e71$'Eq!0-K,7k,3%2(77t - +Q5HoOKCM/^Ka_gN-(Y6qalOIq'UB*2778shDi'-Qbi=bp0\YrF[epk)4@2h%+BI`dpt(L; - <17u;3"H5+\J(dWtf*3lm)l8X/Vdl\oE+)mE3R$1$:%dINl_*$qUQ4l:NtJ3 - +F!D39E=7sDHtAFtOS]V&*8m!j93D9:E.f#*#F/\DtLd^(6+I\0X)QKP!LYED[?.P - OqO[V3;\nb756Gg.rei?ZosRS*u9r8,'d%M)-&0X"&>"TPaN*rPQ_9@0_R9Ir_ufH'*fs!# - 1G@Vi#*DjfkHBXB/>^e/[rm^\Wn[*"R>Q+/(pUE17shWP2\KgR+X>20Z0AX>r/b_/JJ;WdH - R)[*7&n5PH`.S;X"eb"Fo*HXLV&s3I`GR>FX"",?"%\3Q[ER'/-o"SQY?H(tG-Z9;&i1H*W - npnMQ-o)b1K[Gju9pfrHm])j[KuT9)p3n+2n!/JNLYU\Ts&q+i0<)2thD0U:9?(#<46kGH^ - .EO/f-n%j#88N$*Qh,@r(Q/FLff9a'GSGAQ&WSeC1:=8[\Z*l^QTYcY5-n$\X^0cKk]41>c"2nF?aPVK?_HTABXgU=]"\ILOO",'" - 0B/\9hE7ii`2=$85dbC47([]1^1L[5lq2X5>ZS+NUdjoTF@:7pC)"*` - pH(4442"!r=hdg(,Ftu&N@R'@.sEfa-h\`<4b57+E>dqC/:X5ILc5XmK*<3PI/'-F&n%;6?4II'lS]*51_Q,'-d:!.2XdWMd`gp& - H&Tr&Ii,2h>qR%]c=P%O4"IZNO^cVL7SU8.fX/J(=$89meRYLOJ+%)P9UV,4!HC;(Oo\VdU - M`R[Lq_uu06*8jFbdtUY3Lc2E1!N8*d@Dr;PFp4Wj3\fg[`n1iS!DPe4l+k4hAgOl>bTI=G - KBV`T`&0+ErXNMq8ZaNc+Pi**XBrXZ+HNui>jN.*RDEi]aB0^b<5mRIAtE$o?7+Pj1,B^^$ - bsu-a\;)gV)G&I)i?OpRN;chE4<8]`[>$#8Xu[j'D97^1@d;kK5le`dUPaD_9jOLZ&)gX?% - NPa"ud?'+clY]=n*P4eKQ>5nb:[Z!K<:g,"XN.HZ(2ja4DaS"nCQ]'b!Uik7/7?BrF@akIi - UJ+j*!CP15`f7?"TYj2)>*qZQb3^G^,K532lnMYEVM,#[Zh_CYVIi#n^oPg"uSTHT8YlLD' - ,-2/Bi@B-CkI3'..>S:JZoH'rYU6dQ!2eA*^@udB.efN:>BWL;Mb2p3R'DC0S=`"nU0(]VC - Ke%$:#^XFY.l6d?Zh$/GcVsU_VXO2+'>h`?&CirQYSt_b.$t7bO_&dpma:!dkgS6%tB'ppA - ]l=J"cUYjL7+6L[CZ)hlt8\[G=FirMa:XgKMC;?hk'AG9`Lf`O.[_[R8dWY.?$Z'&d]84@2Ftu-$(NZAo0, - h`oBrgUuI46PYU>(.I?>X6&&5"&m5'(F\/B#VpLlkL:'C3c(S*_[>ol=PuD9N3qQI%s05RA - ':N3Y+^:C:+d3iC^9;R`9B=Q*'ga?d^0*+rS#&k3K=0HAfR&W.ruJIQ0,]$t]-j/@<2R*m4 - #"p%REm%F8q`4%GHTlq2f49_?R3j*X0qn44*>\uhK@OhSL[oYh=:3o%Ro7obM[BA0Kj7pUR - T3W/_S3`=/4I8k53so7p?Selub/A0+>nOkjW,on;i5u\OPh3rVqq^J'IN'^!>rtp-.p@](& - #1,II;10I.//^JD2WcSCS])#V'd]E&;QY;>ss6'#7Xqa1nKk6\0rA0V>t;%+HQ6]jIkn\oK - i>62T;6cTPFdA.!d0[\Z`\O06$=TM$Sgg^<(E@`%N8FSHg,sa9hIic]CoQ#`*d_qgkbL+7^ - %`j_GN@.B)P-6F@'/W96bjp_#'?!_k+Y,qnjMrT9;gd=<]b=YJ^<*^omkE*am%Znjdkp/,- - ZgX6-Vf]'`:LT?<>eM#oX,a@;DY]'1/0Ul[i*N!PhegYYsQc#;08@!7o*$b2cWZfb<%u$Fa - \*\;RAl8;:ZJq3FLHX>l@LM2*I(0Vj8?O#X:2:P?1mf`GoBkZ5oE3+AGbDQFG#bIrekn9-J - Dd2atfD>uuI-G:)UE9k<,TD>XK@:(?l=i0X-^J_uGN++[` - W[NUW>piYnRA(^3"Nam=".>d+e`^,c!GQ$WEj]KN2M.ClQ!LDgA[V).@=Z1&[?od(XS`\RJ - 5CM_k(0@*hqEu-fAXX+"VW0\N0r4+2Aoi'.q2VASB:3qPTBUZVbHbln0#OmYqBiVWC7:1-U - ZWNgiNhj?8X^MFjthj`r$mYA@:gSOGVkrV*'XRR7De&(QX(>Zpn>[JeIEh - %V,_!i>q/&H4pcKihuHtOn+ni\nse8X4[A'OLJG;7YAf[!pPo)7`Uhsm80=iGKs0/MGV3.G - 5^H%%ZZhf6@8RGheF$XmSR/Luq6\9Mm"k2cmVg?(@H4n"%_Ch:ZY.EVn2W8+[ci8cib=6#" - nTAC=[Rt?n)Qt$J.7ihLAp'SXnELAMaNKHI"fPO=k$S>pN!^I";D'24[3@l?Y^Lc.&(c2j` - :^EmaFoqc=<#^=KU'\Y\=Ti/rid@t-o9DZH#[ps_L+iB:61tfn+q\->YUUER\;^ULg_qb@Q - 5[N$QOmSa)2;cL_*deH'B2tHLQOIp^uu!ti%/,eE7!]8K'*'+9Ors@oZ"n&obaDC?AFZ3/& - hWV&n0:+MNO;I63p?q,G]C0:qAV(a25]'.>3]Ni7(:G8JL(cIZfdlb/NQT+Q,Y2IPMs-7_$ - &D+tO4fdE5$QGnUZ\/<5WC62/M=gEn3lXGSZs682O-'r:3'LCpOfasggKj]nsCZ9hehGde; - s/?Y-j;EhqLD)jKpa:!MlY#Fdt`JeUsYAN@[88EsL(_/mpsePN0cTN($r4IUgckrZq_:D - /adRT/r$]gHb((8TI&NCdFS1o6H)T[VVg;r%%=W>*>1dE9'rWT=noo_PXfqS?=7j[u2RWi] - ,G5>(/\3a?4UNOGR2i>XTl]]_lQ'-_t$LM9d20Y`/k.Fg=ULC4ROKCE%Qe/h - nkq((sXtO22OZ0Tf9csGCAuY5d[&BSf-7>ou;`Nhia]4HqGhVtm4ViDR\[1.8go+(2k&cfU=&D!(-q+?9j - kIF,G3iOjq/e9C_4&fPn3njUHf.W[18lD`c-+WiY@K?%0HMsn48Omhr4nhhg?Qgs$T2Isi5 - 'Wd#0Z?Sr%AcLP'CSK?t5`(i$,861%OS`$oX=8[g\!=CFp&VDDhG,MHL"BjEfs[2#Ld-Ml-D%3pY9!p.oMY>=FH=fCi[(t73&;!Vt6X - *$&'dot4"XSlG,p"%"2)Ojl>69D;kf#-0f(LCh#I((uY]@_I+>\h$"Zo1D"fUH5cm;9-rF[ - !UpS!S&0h9W@8(;IT\.p)/0]souKT%odlFDYl_]!Y":h:ot_Dk4GKpS*])>Pi@*mDH`IpY=O+K^R,$\[J[Vhtrn!m_/#*GinMN47;D#*\"mI*rXS.IspRa;p9@H-/NB - \K(6Pc`j]Rf^jNJRn_N0B30r"PI#FNdmQnni7h=e\LKeU::XODG.HqhAD=kQ3bdgTCai*Y; - oq%/nH*9BiS/Zit%V`P$QV?[kl`p(WFk_806Jn?;Y]ap-^q&V2i>m]9oo1o]qU]QN4maD5N - r>q1gcs1t61:_g*[:eqVMf7D6XQmVQF#-nd"N"PGtch`eM`9F)<,j2$amERZ'b'j,"nc8\` - A.0Dh8M,T0Yd`\7KK+cZsDFqXh]u[.\BkIXg*G1]>ofY3;![gZ5d:X,9CO&d&&4%fZ#HL)UKG=Loe@-Y5GSFrOs7;Q[6YKH^ - 5N+&>S<^qEPN86Vn=(J"660O_S+BQ5jT7B//u=i-^AIk02"PpPV,6A'r8bp$A9kCj;\S$p' - h,M4ISu&HmYXVfEei8YL=FWga^-;rBaIK+I"6@UaSS<)oGV?%%Gne30D%09JV215JYi%6U* - 5F'#%U?^gP^*Hi$2f:7'*!Zml8Hni4])I5O*hS:CEU%/%L>VJH#/OXX\7NsM#Ye.Wu.46Z=T+Y^#;\ME,A><+? - 652f&/8n$7k9AD;66kAC/98_*BgZ\+/c"hIl;,Hnh+!n/7]WegKQG,>Hc96l)u-K8q\Z^Z&P('?8+`=[p&8ak8=[OdK\E>64h"+[9$EsJ/@!BN;U,EUbWNJT" - JV\CSjAUY8lXckN75ooA&AGJau"Ol4Qo*_Z:lb,c4nr"`$7eem7ObL^\m*:RRU"FY04K?a+ - U#02"!d0j%KR\NU5Fagg%q-^e^.jaD?,so_$N4l*e59aol9IFHfFG'=hq4:#(Rj>bB#i"!P - np^\#Xjr<1#;6-*RFcj\`*r2q=#f?PA+b!`JUHtkTbhG=glcm6HRd&=g`%EQL'8,P3[r7_6Ukh[:]h^d6:TT[F - ,n&''.FAS*`lt$A1rTq=`XZ4t]Xn$[/Yrh+X@CW7=:9C,n)ZDg//S>d - /"!O8a]*&/fB=!7-sSDI1ac;b1)Cr:g>0bgojT*+]N:_5%4uN[49Sp"&<*L$rp&aX8^Us9$ - e:T<:on0`Df`Ui]./q:!H#R4[[V-FY>SU62`33A*QG;1K9WFa,NL;HQ.Wl%Rr1l1Kd2YF$ePO\iLt>=m%NTjrh/cZ"**'lc;(YYe[;!otGu$#B=D`E;^'r6c2Mb7b8p==BZVDN?6`:[*d,P=*&N;FF6K`<6T/T`75_Il:Al\t":#k)n - HsBsse>:%HZmk9mQj*Yo`W@-*kGt>q+UY?QXpO#Y[U;GI.Dj1SqS0#0`F,hZi6 - o,D!l:@h`o,,Q@$VVfEfFKGY:>h>iB"\%9"n`.Yo@GG@H"_t/e_[u)rV8Hi8,^:mMXte^gZ - fM@D\OCeeMYGI:>)_i^PHX;LW)p&M2>`iZa<>.aI"-/?H9+ih;:j2@a4D/`P>rAeH,)d,Z6+jpeCsj3tBlbfutl'MpQ;`u - +C6g.Y9Y1sS4jNSiNnZqbLOK>G1sVRaU73J4(fUV,cmIQPHXB@EC#c@4rbJ\/7]]=YE4p4? - rS`4FNMBO6DV(5(hBLZg@?B?#kmbB7KQM`A/"kgQZtk(PldOCu:ekjFZq-BGd1H>+FeBZ%8 - lp6TJ/R;"RF3^/em[Y3o"^?M5Z]=rf.St'NgS*CcXl2ID>",CPZQKb8ql%Z'KAu+]]V)e^s - C7_MAL5G2%U$?fYBjRS"`fXr#Y%m*VlP>+g/tb=%YA4W8kpEcOHg5=Z[q_e)lR&ZJL:6E^\ - a+^0CQ>[a5-=/%]5*^old!92hP+f*_n6bnCb)^U*lRE"^1n^ECjs08:;gt/`Ft:J2:aU^DK - c[0qS_.];jF(i,]-5gU?;`&]b]$ikj1-O2/T"l6&a1AI=,/QZrfCMe5[O<'D#iN?s/3BbWU - C-XbT^6#]:SF:%b14]p$jW.#inimG3BGID"ttE*:GD=VY@ASW-O3qoTu;/p2Y=HA5eGP3un - O<@$R(QLr3%p!PD`8F=%>L&Tfj*S?%!=MF(ff("U:o%_`af`(]L%f4iFB5\NKAc"?[i)qI=0_C@W<>CE)-H%!sqk3r*B7n/ - ^3]iN,_W&eU6Fpm?H5jlpeBeDmdPd,n!jE:e[-Xb@IXB"^u:E)Vk8aDqusF_fjj7:c@b)n-`%NGEp#s.pX)oWSh_.PHk9+f - Yq:MM6=8:.n`s1.&:YD;O<*rMk6t+`R47Pfj8oI5k(#\^S;V&4aDe0^Oh_=^4A73@,p,?+F - 4gaZr-urZ#dgau0jd(!q$spVEDU/g?s&?f=p[Ml;p!e%idpMe:A69oto`Z(Q*'gg%C=7NY6 - P[0uG?XMOM6a4up"rkE(F3m$o'cOB%#\okb7UE3+nSHg(X`*"f';$k#9_s77%)u#G@ - aqJ$`eZ(iJ[7O&gJlc7XJtEEW`oDbP8DeQSSdD>.d_5;$qCb4bjq_;BWFJ#r8iV9W)S7dm) - IAKgpU!;@Q*>^osu(%olpJ9\h`o\JhS-,n6G$22OIDEh(s%5E+bWcZhp;)?aH:Oql1nG->g - FB>dB&b&>pHD6B/qWGnHYE\Qq`-0Y1=`83TI$O8(QMC,hr$Ta6Q&fo4OG]R[r26uND%M"mg - Nu0,(]1D9qbQ6ua4,Fbn8;$6p*\Yb=5 - E<"me;4@oJa>TfBi54EW$C2YO@*k2;WbR[6;i%dd4pD9U[.pcuWhZH*s@/#,GG: - F@n\gM`$=>k>ke4d]kp7g>g^Um+1&j\BM.#]2b`uJ\]FrG7&4+a)nK+n98*eMYh##cZ#2^" - ud9E`8r^r)[tTPC<52,\_T0@l&Wj0C>*Ld,<\l3Ai+[jBb@(.W:a;kG2c,GEr]ni - rbn%K"$S;[uYq0)W`UM@mejOMAh!7?=P[aJG;-Z7'71B%a%Ru:KI2ft!'H&&ZOt1#e]ImF. - OLD-W.$H(C>BoGE15e3K-;iO%o1`*kPf?-e\u_IHDh98h1^dO/X`eJ-M)>em^W0c/D?fiBB//6%ouCL59s]n& - aTf"Jb5]XFW6BNl42_/rb&7+O;&Em?7GrEBRu'UZV9'Q_GA\dPff1<%O(#R';.\Z'/d7I!QY!R-e@10<>Xt1, - *DKo4^2%\n$-n$h=P;h>Lul&;+PY(del7B!_`l:R,?ok("j0)@'*\kma^jhC2QhWBm+S%e4$E#]OX_!q7$'uB@o17>gr>PBMamQ - :FmO6?FZ'?Y7K^H';T=e>6'FBl9?d.4ipF3=+ppJ8JCkXPrLp74-Le8]n\$CLOqa*HM5gfH - krpV"$$a*:mNLZY]9hjrQn^*dp\p\cH5ja*M1s5R9H#G]f?rtfhHHMqc_jnaHKZfCTt:Z:F - 3?Y@X2q&aOcp&?%>Z.;BcM>uu`I*]FfKH/!qqp/RJI^rD&Qf<7GGP3])gj]jb#5C&AY4f!aglgK1]#K_T4cA)r)TfOE(^q=CUmSj?%q]D<4,tqYX_(( - ORpf+i,Rf&0W:nI^#Oj7+dJ)i^?UoYAti&-g_&qKCk$tl7GG,D\D#n9T&8CkX=XKT[csI9< - CoA[PW0\(:,?&leSA,`kL&n)LRS8os6R9Es0a@>Xcjg+>a9XWM=MLBi29j[MBr0f"0OMCH6 - _p#q6g[1mhUT6'05(?R;MlO_?:H;Db@7-dn23Og8f[/B2kRj6D)Zd\PnrBhHSfm$*hC5$'M - Lm2](l5aO8>3])\F=!c;oQ#akVg?aALs:.B@fO^tD^.I(hCq<9+LFJGE`RW$5,[_9g'm%?/c;,0-%`[.AaS5ZBpb_cEbP - +%o8#?kHXW;f6J\Z)<$Z@f5*\OG](QUm'P.aUO#3GAX2:ri]MZg(00W8,smP/Wh_R67a9Kd - r<]*`#VtD*k2o/=qaIISkE@:=/"5V(8QN;*%CHkT$%Ro`As6aXp(3r@O"cCkO]M`3tOIAh$ - fLZ5tLC=AO'LXb7CR0:8hc#fj_`O&Fl^FF"nG>k`o^=\>/=mS:gYdO& - :=IShf'#epqFumTFRjDP1jbU4n1=0/C7:rX'OL*Lrb$%G<=KP;k[._)Ug:L!o/:FV,f#HKK - gH/T>[>hP:9#FkK-Z/8L`No2dg"T_TENRL!\5l)T>:ZOVY'mLaG>@:*)jP$O - Z51]m)16pR;Cq4<&iiV7sg6-OX:o0n?Eu,JWs\$Xue,LTnJ__tW$f@iK'aEI#.hCR-:m\TNu3PP:Nm,NilVK0qL$T2Ibop]oTJ]ug] - &8"W5PAkt\cPKXuk)C+>Z;u=sg)DMU$p16RY(+dOF%9kZV53b&h9t!%ojV`KSb0n9eCh<1B - !#'qF^C-[Gb6DLh"-VLrjpMr>>=GN4/6aQL!b3Z;/;_`Yjg5_c^KJs?Lu_S55&1 - T,Ggj3RVk/F%X*^%dW\dZu7:in_MkG:pknq^HOQSYN!*5*Nq<:OhWC6d0R7oB"u@,4?Pud< - M7tf6m=2nm5tMqO\YeHfq*mI`'^S598qbf<=O)F/AHmhsA%sU[k#Fdeh@#mJ['=D10%ToUh - ',4[6gX?Q\QYYA;F4LL9k+p[!kg6l<,i*0TEnViDO%MZT3ARZK-5n"]AD`#qaR?tbPt - qiC#5,m8$Z!r^$dh_5sa"O-d50)MdP"OKJ0E)J[b<[#dWhSaaDDph.Q\4hnYq8Mq0,hA+IF - D^(;pJ0NL"e=J3$=6Pe"KCnojPL.p)Fk@-X"^.OD_2;a`g'B#mguZ0,BX1:J86im$#iHE&8 - %Db<;@dS$V@$"OOj`agBEI6L6)iP0RjPN5m0s;%?:.X:'h75T\q7WCgr#'7U59+AIg&S&2. - _d&>iG]OA%?QIHEs.D=7p1HN5c+-ud-/d1H\Hr=U<>#-e=AnO0O!h[FI2%&@p;0S:!X*=MB - D$.0V(;!^-ZjU^l-'lI.j.LQfmGnB*G&$^[#0T8EiE=d,L(N<4N:i@'\Ntej%'JZElEBbAH - BT]GCC%)f]W8K)$Wrhh>Y\<0nC:'ofo,XeUYjTa<:Y>ITkk^G0pI9?NSNF4g&QaDN?ucBfL-f-54KS;_9M`>;pR3/%#o$/ - jp3D#Gq - 4qo#&lg$%CM+)K9AlF@91PnCs2]7jN,'+to<+/3pAO@$V89:OtFO4PTB/`]d8Q%aEe6+ER9 - hoGo9,,aC;_LmEnP$7J-NnugP\=`o?TM%m:p0=a2%`G:Db>-L85h][FAYT:1J%*@9U.7t1c - 7[CnN[e'Pk06!F"9pa.g<IE!F+t$Z;mk$< - b9_FrT<7`Q6d7RBq"#[2A'q&*ElsVbK=HNVb9*C]irE2nu0STC+('%f$%8,1Z6<+n28Xi'> - +]h5c:=MF12C1adR9%j"IKk^Q4B53+_.t&CDN=5#*2];:LobID:9/3;k[gsbANW`:\F0g2LSJ(Bgo - 8T>#-\=f*+b:`CAGgACYs!G+iJJEGQA^EV(E:kRA(;9_4B)BjYK&V3XX0HjZcOD-Sj94Es,=,C2TNHL'O?/c09 - Z-Q^M+aS4u64WEX$:?G>tRT'lUIB1bV!DBfS+0;a2(em$GD5lE;^=/sge83 - 4-'g@CM%ke - W\.`eJSVEM=M,se-p@)m#Ru>qH7lOTp\B,Ric"1F$1Ua>V(=uLYZZ;=LO8*H]\8OUA[tV&= - Nu1f9=P\Y+R]A=W'rdl$h)SHEkG5A$pNb( - m"EL4Sa"r(R(2je>]e#?Zk$CdIWaOj-[B>L4^A$3Defl[sV*u:%);MQb,r[/9+VOUs(-2i"\rP1# - 'q&u!9\KrSnXU#P+/#(#WNdPEqF@PHEMV<2KCN69>*l9mSY+TiBOla`UN<#1+/hf*U0;W?q - F#'Z8ZGtYC\i[\)HDSs-`236U=F[h>/bXsUSF#YUY;-<)6X^\?(5%;SU1sGd&3ra"0>A9#k - P`qUh,kSWH];)!g"ED29)[5OdHm!AhZ!oNM+h(cJ=Ij?Ho:e%FMUY[b?(5cL$1lHYhIhbg7 - ;5[k3cjNQBI@]srEBeVn^\]48>:lIQuDfM/C!XJ<;L9=A].\3"fWD6::Z\?TgQgj=G(]5bB - nY/VF!chl,"m6/,Zah=f#fpe5UHbI&'VT;te]=Z_IH\&^h\[`[:]GlaaHiLi"_nFgj^PsPR - >H,>rPg`jO_#,LeS*Rq=/\.Ad^)O>g%;Wd"#JU*l]%f6X/(;.Y6,WT#\U6ZI>DTGP0>\))> - 6;LEki8"nh3^(;Qg,E](QMW;=!!GT?01=lHUiEf;8N0oaW-Ye*0nXYRE=6ZarI>$r2[tFXi - d0;b?VBsS?^8m\'+]]bT+[I>g(>Rcchp,bhU[lSCc$@e]o/hc91"0>jK\*n'6=PcJ8*=$pV - aRW>rHgH1T;$>]Ifla*CaX:o,O3/o/d\S[KLRfR*;24I*]E0u]Wf_ji1)43c4oT@3X-e%J, - fI6kX'"k; - e_F*V?"DO!>M&h?X1`N*S-do?.Fc&+_*(6;44V0;Z.`GigKY]0ICn6^3Pt`g]3Gfq]kuMpa - 4hS$g721"?-V/qhqi.ZchAo+4$gmb$/bVQ4\LY3 - i1JDQRZ?EZ?f2se7'JfamO(Am+J - Au`S5-N=,4?NoUs1[^i]D-f:hSt!$l:\!<06!gI(hYE/G'kuO2OabQ;e/@GA0-cUCO&sa!T - 1AK:UQo07Ys/b65(TEahgJi\oWsPLqVra5F'=&"oHlM_S6mYO[p@`Ud(L7&;q%)h&)\H5dC - 6H.e*Hjb^\[QVHZV'/5>C8^;+oH#M17,Octe>YpO1Mkj?DsNT3%=Boo$P6R_IsGRb.p.L+:Ve!BcB!oek>!ZMs;6:VXA - Nmqg[,\!+l@aKNBVX=%2EXH(8W1IC.Mn'c>=!M>h!fV[r:;XMc!@?UgPu2:FN12R0HRsY-qouHYn6NQLrqk9,:GmR$^,rrP\Ce - 9\49ZO2Z*.@`qBl;W5RW0-/+ - *QW7`T-u%,UoP`?:W+HAb)TrJkX*W@<p6SZ@$-G5B2WR0"c""SGkncl>[S*0m"iu5 - #?(4qp"]lf/YZDUtHJ>d"G[?c\ieDkb^1hOV,6Ig[(]Z0?Vg61@>9=^FL]a-V_YL2(HC=[) - 60;9Q5DBo[E'[do"DlKJ>6m;`cE@Vc8X\o?hA:imbRtXGoW\Z>79V=0"E,ACrbnLI*jU"\C - d>0[(29\5m[lVnprIVa8mWZMSGqeMFl;ZSlZ6kKh`hIiu\\lX)uqG>-a+fMg>Wp=Sdb,kt\ - Ge_;`AoZF3=h0$'S9>e7Qbu;Ecbuo5>0*O4fcL.O,J'V):%tUo?,<6_"psgsSh,s#;VPoE]MkZmQ - Td5AWL@0P^6**)F3WO'51AVpe-UflP^3]R+[sH--C0bbhZ6%R]:8XF0SK84C?iRd=CksCnjo#bFT - XA;%OfV?!ZoNnP$=3X%4XuH4UQS[lIN0,h[2K\.dA+"]j!Vito - *k>XI7Xl`6p*R1dar#ce:To>V_6t2c?/k%"0J1Vc8.+_:la;'-7=mUe`m5`s#^u*RgVUC,k - "WGDGcU620kYV.TmSjeWbrG--`7L1KIMXOW/raR;V+`D/9amE!^Pn(q+[qe0s8?M^&gS*V(gYi^7Ik^nRMeZGTtsiqZ)Phj71B!]3V=e@DHT7@h]cX$QuXt - 9)n&j8l6B9c5Emc_c.u;2OUY(SB]3#5Nd - E406C))d;"Fm,"kBXmfmpbC(P`ko@^..P."/4;,/G/oVIdYZ;MRB4QRkp1/E@oeZ/(*CFqZ - @(#jqr.3Dq/72_^I-;Dl;SQtAA9;XSt]\%M-;.K9OQk`f1=.NsY6n=ZAD@90#^>u'&]jAbQm_c'MP*2*iUpjC5bY - ,h1h+S$`Q!nQ9N!f&.9W5MR>68+<86<#X?,(-t#%:.TI'CS%]@J>6\=67H0Zn"FGQ-^[bX# - o]SgqM)cP'aqYD#k$(;\Y/a5$S]LF2qU[Wd_ji2>Of0$Vk3Qm1tXi]DNBp,Tj3de^Gc@2"s - p-_M*U-e=dhkqF/Q_:\o81=Y7k+$Ao/,`;5*bfc,#*.H-f*uX+L[imK?GHP$kk8TA9i6kpd - c<0Bc_OS#m1M07u\%:BgbRL.bSqFk)NK68^+.8t&;nY3o''LkkNH?bp2g;Fq;ehqgZo0\gQ - q?1GCKT0f<,H3CaicR>AUm*.K]?G9@pJIjV,]*bi - J-&33?N#:>$RI?#;]f[;cU9]6d%;36^!\XKe_;)e3T"/[)[c[S5MhPA"kdPI("4B>_@1Epl - .MC,+l@gH1IHn!oeBTn_^cRqm01mE`Q3]XQj)$ZfG<&&#JJces,EIpsH"`&Pd6hmOVOE/jP - 2pZXinm4CVpnm<8r3rJ?/`4p" - -O]-bf9F;C:!YjB+mH;[q/maP`:ip?l2/eWoNnH5WuiDGI$:2NDSaZ1mk!RKQ^)`CiRN9Ue - ?qBu[rsCO`js-%gRWE"Df1VW426F5r1f7q%ZB8V[pHFI42(FglaJs?[H2j!VO?j$+^SL%TmOO[lAXo4E'Db.Hmr*Jd_hC'd_j - mfKJVrnGJEsFUYP`RVss\8bFJT*k55alpO4LCqL=:arU6r]^?;`tIeW=1:TaHk\(LESQhGn - 3;>It&g&?KEoRDqcK0A8n5Qges'E5[DpHQjl5Vr8P/+LAZ#/@M=^[pU&MsA*!r4ku)5_KJ0 - $i[mT#Jegk^AJASliFoVo"Y)+_"7puX;/GWm6Ph,5m.idA-g"F'#BM=5J.NCA+ma.kWsS"6 - /3Tt";O2?$,Rr)_*e_u*$@PS#=1HR5/\I.C[+53-,M2V60&;;oIRkD,X:'15J.h"`$[k:rP - IV?_]0R^"f"'.`KWn_1c32,6UXmW`5FQ'*+;90@RbHG - ^]\#a9J=Cj'#n`c79fsb6p*qXq1Aa1QXebVdI8CrFOs8$m0S`-k0eM+.&laJ=4(jClPTBuo't_d%LY/6 - TuWK1PnYa7OXK4I!^iKLiJ*7o?o=r_6b.C?P_/U%XMD!D`9(>`iq]`EFZnr) - :\2:F[9,o0$\K:o9+;uV"Wk(if]LthT93M>=CpC4Unu4acZi$o!XMD"q7a*-e[8aZX'fr3OVCeh>7Tb9X78*6:e._p"Y(9&ZpHA - CSk?W[%_J9t]0'XMrF?36Zc`9mUhSN42P"K?`2`c4RsU"N)fbcE_Go9a&a9'\#"abI!0PcN - MS;KX4G.;]Ipg1+_q%OrDV<]hNV4c/eTC>ihM!YVmUmt93%acR7d5;;m_7Q2 - 5&0h%AYS@OC>b"Wu&Q)7A;(WP3`>Aqf*=0=t;?[t:'b!t\+OVC4;:(b/jJc"<[aD3#dEO(; - FWo,n-.5d0;/!13I2,UJ-IUu`M9R<%FXnr\,>sL8dle[J74b92(m@C/^oCq;=^&PEa_oF,1GpH;l)@XV(:&,1=864hC4*3U[Sj3l*%P5J.U9kVXHH-IVU]NX+9A@/])$-lCk9ZpRt,kP))e'Ba'1;^ - _/^njqFk,/pLXG"EdAJ$c*H^[3ugh!WFKjG/>N2,27WSD(4gU5:1r5CJJfXk_A:$i$g--BJ?pbh`UbHdes7.hG8bGfX!eH4F[KuZrA - qU1q!9&7rhp!GIAa'@H`&"VP!IF_]J\R&Kt>F"9q=e4F"_-Z3I>UlbZPEB1:hbOu"?F8`sI - E(.JhT\IT>u\Vg<4UnWo&"$8eudY4"S=4Hb>jI*>NOo#jL2,fpc4>MhrVN^4p7_Z&`g")s+4B&LK3fYhlu6bXDP;0lU>I@SbOM.['h3eKim`*&WDY?tq]t;TN/h7c8 - ##,;BY6[J(lifH9nqT/F^L-/t=!s/o)$@Hj^C4rUFIn_qI)Uk0^oCK"\AgnH\Y,!o:6bllh - =Zk7Ur?(D/C[C)9'a3gIGbap%P.e[4c]\Q!L,RQRSDA?QekHi_h@n$X\ou!K1SDuWlA)f/u - <]o?t"_*Jm+9F'(33a-G43a'2jH6KPY",mG:+g-7)&Y6i*UI"e7Nf]9jQ,"T`9H!^;;\eGh - neGaEB.C_"'sJRj(;@th(E!/^_hp#@s0@t4tKGq/*7=@iEe1s%SC)oji?mUVu>=l - `%aj!.3+3Da4fWkJs6jj%7=:,.d2f]16k@iEQl7ST=cC/HjStTXAj>MU$p697i4m'b)d5i+Zk*P.PC"oM(?P([/IRNI5< - U+k;BkJS?F - Sq50k_?8jB:b`k,$Lbr\Gd-l/oT``Um&o]kl9H4hB>1V\74W'n'B6C1UF& - n('kZBa`bIio-#U#KrUfAm0^P[>jpn@m:=F($aDF[3B4[-?(>t_fj\=m;%u.jcoQNN>?K?. - @W+KYrmai+m#%uY&\Ep#A[*LkI3m%m[I&`)s_,+[N:@7NeVIOk\k&I\b?MN - L)$$.6,#LW'B`mYk@HJ999L']FWX:u?Sc_VDB5U:hJM=m7jCqs-ZlN#E>IgarN>CW#As`fn - `?fV^=d;*FCODTFZjPFG9a',,iuQIFC=0Qp2:ll5^0(To9V]8O'6YN93U$_GFiI1)bkGa^j - $qjp7FkA2gKCY2ftpDG6NV7a&m,C2-Yihq#1?bO&:$qLhZO#F2G#KZ5<5T0M<^HC55sf2cB - 6+.sC*(F;IthNt]rFcLanTm`-af%OH6Tp\4E9?r=Z.^S#d/s*0SSnU_;Ch%"Y<3RbH\mB9X - ^!CdNY_tXJ-HFK(5`PhA_55Id2.jpHfI^\IdE;+R:mOJ;.pMk!sOlDXGDm,158#CSsN?>Wr - BY8j]PRKgiG=X!!8L/jXN)rQ<5C>-#8RKP,%!>)#iCN=!I"Z7U5K!ECF3/6M88lMf\'.D`@ - /RZ=I123.a2NFRFif]drCe.-r0;ZrO%9\3I>gmKT>Q(-qT09'8UnZCFGg%c`dPLFIF$/dhp - -[%GfMJur:G=6\*!WoJ]H[%rUc%6n(,HbbC2\4I#luQ0@YF]eO+97Ih1fB4?EIpC&VK"I]( - fsO8/\o@Xi=@8PeOL0A1f@dXOfM$C=@=bH%#%&WnMlJ.*>XLNi6dA9C,6Q - _87U'rr$FuUMF8a'8S!i%,E>0d1C80#D(Upnj1kk-RS=oV7c=nMm1,+C5Z"?MGeG/h7]+Z` - '`+()PujtalP40*AueOl6K#(_9`D_2Zr=%AR\d159Uj:>(H[o5j*/(@0%ZTSmeqII?Z7t%( - )I:4_;]FdX@=i`NQ>Tb=T"a\.@84iEk/j&F#BN8BCo?o-AP6hdqX"D]fro*Y1@C^>90TYD6 - r!aG8n6HpN+++E&ZPn-P)3RjDfH-ITJIr4J-]SZT/3gRkO'b,osL[lL3MufR$nk5@9c?_YC - dN^%B`ihWd\Brb7FCamJeKrDKi6,Nt]5DO]ef^+ZPdhn@@;%03c^4:;-S:\4/_^<`"h#4'a!/KDA?Pnp'81!H_ - 2TGV2+s+&\M_Y'/5&/qoeM8pap - g`=/4p@C;:Dp9:K1=o9jLTFNeLZGd'\ioX&?>?@'NUOh.Z*)2+"!(UU@d9l-\'V,?n5?D0' - 4h?spIo;P[EHfuY/K]+@2?j8"X&jua?EP%>c%b"uAefCD[pC9S?[,l^?/kUE - 1J)%XUJd:@+JB[d-mKC8^D2k^29Z\3h; - 8Yn3&q*TP@VZ8]>kccJ-ugSX'#0EuJsaT^nUoiCQk8f7QIBo`'4$mL+5AUN@4S.8>.neKIi - @I[0k]p)T/0[V#CiOmHQV#._nMRn%mMI=?WfWp`&=mJ:rh:KI!j]>f$_\\c"WW9[dN"(r,J - h)dR!!$9n^JT&6`4@6-_)LJ2m0:E2$-Q_1fA,L@`jg)F/nF^2='4]7T&%ZBu!h\g)ILoZ_[ - [9u%?2Q6ln@>d@#Y,)kqb;4Wq?8sJ)$a3d/U+Gm#t'K$_k;YY;[Y?*3PpIa,*XHo9U4DO#T - XUdak)H4V?X6F%hRYm9o&7%VF+Im]%e7jMpDk]`oZQq,'6810^^6ukDpEh@pY/aA`Q@KOW> - XhqHsjHdDbm7*FAA_NH+5O7MpCmi7rC3&_]l4\?@1=4BRfOL,d6[b9l9hJSGct'uB,/r1Fa - =N07p6b*\#6@p76&ELnj!fh3Z&$\r-[/keRMRdT&&D0`5QkEK&Bek8[IPu#Z72>CknhYZ,Z - jCqi4-#!)mN(7j6>VeXcdl=535*g6o'1f'!/gjo8N70*!c'WPqVEBm&P$W9$.G44Mj>NV#J - pb[CX#;+8l]gtk76ud.+_W-#O)mpA`O@c,@LX&qe3\jb#'VKZ7),,#@\&)bd.aqL6S%Tg#<[e6b'?8Q1M)=XB=dXS$V@X6RGiBr)J_18\O2=A)P - b7Tb[nN*8l$MR,lSJS>M14\#7RkQ:E - a0Y%RK"TYQ]e+e!RIr`ML@a^l:cBsggoXAKa053P5@ - '7ILb_Ppjk"Kd*X9OX8>B=NHF6@);iks)RE:2VkMl^!Gn'ebgX";-fU"3qRh)j(^Dd=os(P - ;%?41f*??Mh9\D(U@7fFIg[lh+tpeeVQ#rl3 - =_#rqAh&[HYHj5J._F=IGn`)O>=@Je<'DPeYr&bciH/9?e%"L**;7j$^E%?7Q/5/-eF(g-+ - hp_G2(aS6[K;1+^e0[7>QR9lBE4L502"lWsZ@if'UV1#Y07Yt7U0Oc#[Mr]>,WL9e)k=erA - .ul6cpbI'T/7!D)^*^l<00SCOWrY!:o=F83k`tnboEt6I[e>1-9?LJ+.OeT2[a_h3h)B'j< - JnWXNoaRkRAk-gkZ.G>*TkPi'fC`HYZ>;bdOm=3*Ef,D%J86H.pU0\a,b@D`4 - EOeX^=0lY;1jTA/e/YkH'*Y*] - ;ICE:s,[q6](QgZkO*LFG//XkPN7s44S]pWn9aktc-3GVhL^%Rc!OY[Kom45!QdX?K^a(c`?@qGI7636g]1qD<--]b537 - +j*o=Pl_&I[XUqbSF=OC7t4# - llYn";"W<&9.n-_ZfNa#]N-.0NA?SM$Iu]"Y_k7OI$8-')iH%")sA+cq=DccNis"s0.amYB - pE^]*JsP"cqsGOF6uq<;NhQ$IG%Gn.uL0AHpMT%?SmG"n)g1gB=b:"q]5Y0`;M9]*j[f$W( - mIn?2r`bl?&dpCR'/E5r@uhYp=b%',E;:>!!L,+8^J[gb=EBu9>>^8]LI'?t>XD*43&Tb*" - T&<0ZbY84h;p?Ref'Q0l(ND0Zf.bmUj&S@-dC(S>qm2%Bcd;\I?c?gZr=,Os_;NZ>4lm3:jED,J7udT%0j=V]=G*@l%M;GuZIh]V - J/-;.Ig`3;?m!^%`]:8E,$_n[W4Sk_YS5I-G)AK8mk](&\$I)I."Ua7Ic-qNF9:LjPWUGXM - HDFnC8:IP%U&t(>)n3XFn2=f-H6sVD+"YI%&40n?4P3PRn`'AA9/k!H,P5-eb_(\dI/O[lR - '+Z_6[SA*q/MaplUkpW9!AZFN0QS*bUDGTT0e%/h9N(U:Eq:o)1F]XL/FsoTdfMl,aY=H10 - @O,\P7ohf3ARp82NpKc'1F]u(H59*1\5B51GpmbQqron8+W'&dsj@[a#6jY1,D3VZB[B_P; - KV$23WAId_._`GYLbqS!&gmit=WJP:[HK3)^>M'@9N"#qKj]+A'sELTNJ`^bA^=0QZhHP@H - K1EBeN044>iB1X/0@s#lQc3n(2^e&+7'V*T205Ei!2o:n+K,Y8X/5GL.oPTrI-]0_]O5r8$ - tZh6;a;_I]42`+/p1^>r25sWq"1NXQmZl(^m-UtFd1"9;lPW15WB1QMY - 8@0+&oI!"J9g@-R82QS]'N%7D7nU(b8on!)1m^i,D_cAC99cbUe5&Ih?V=>C:i.+tnLdZn2 - *UI,';r!]&O@EC],FBm:6,I(0jpJC31EgQnI7E$%EO3\4!r/iY\[.Q$nW_]kj6h2B2nCHVi - 9"3d\u]C\d,?8;DQ`VNjR=Tcgc=E$UIXL7c$hb;@@VHD!Ht"-J@U)c0Ga9FY'!'G0K28+I- - j-%(fJq$WW?!;pA#R&djUL[o5/"+jtogPo?08Gpj:S/Bl_+*Gh3BjFc&Z!!5E=KOqfb1BjVLKF.U=`m)d^D/]i85ea$\cpKn<-@o@Y_$g*^=(@(H_&lhugDH?@Jf*cL4m,IaAEOOnFQQL3f:mP/tDO1ZJ)jLO6M,H8aS'f)AWm0mm&NG - 1NL:pA98^#C[J!F#U@P(<:^0a)KYbE>M]*p[`kn6%$/6HT2%N\!__a-ZM)1J+qoP2`Z+B*I - G8@G5&Bk2uA$t[sg:mGP=ITGD0rOeUr)!HHq(j[bH.26\8C]K@cfE2lVKiUO:[WJ(Ne5\6" - *u'npm4H$D3!Z%IGuGC\='L)1ALR!!SK8F9%Cn=ll08Y]($moIk*<7255$+E^>B2BG-I^lq - HG-r%Z]O\'qB6]>\pb.SgC@2mhKoM(!VQ>FF07T@%BCS/t%f;"hT4]@%FUTCn0nYG[oo1To - KT40+7VpR6pfD.JHhS1e=TrI5/WP)&C:2NQEba[G!e;&5JJcXp7_H?f#EBY`r!oN]=R,D.m - r_bqCt.i9e&d`?0iEgCPBdH'q#QbC23PJSI[O]*`@I7BH'NQ"OA(^r#_SF7I..Uf)-LmFGr - :\.fO"A$O)'R>\ORl_'9Ut?Or76Nfr(-]P][k3G?M;u=b2_r]p%eQPU?Ej3O%5*bFBH\-+T - J9=eD/9@@e>mSCsU,(UKGGLiN4[Pe#d*REqA5s-_R9R(%[GQ(OE=gR@q"SN6e@GuL.m*5"2 - )M*oG&cIs`"SJ-7M>Zd[q;iB)A$)#a3eaHTX^TnYLg$F>Z9;_V0n]>)U=uk`E - \jUsK:p?fVqRP@3n'^iPid]9n9WH]H,3pT0<8+1'O'%i/hCgV4at]FR$rA)3@eP7a0$&7Wc - e-?[.8p>M?KX7f8hq[ot-EOB[,?/"PPKt"D - #ARJP-YA%XD)Z8dqBdYs&Ya[e[elfQ\Dm-co]Gc^.W40F-?b9=QW#O3FkkVTsEO/l4m[Gep - Hc*M_`N_>KUQtBn\iqP=6V^??MY^8IdQ:jj7i7^?VKeTH@ZeO_&]56b]C![c>P3/NXhG`!\ - /UQg/$l2ZgSf#7_p!8)>Mm3*f=:_Z:WKBA$D"dj0r>\Ye(UA3$dZM5s1-oj[J?f11)I6$!+ - 9#cP<6J!)r%iLLUgV4-QG_"2D_o`e[eeX\rM!W4+#+d*F7I(^:]rY7T%-e?\KFtY58U@>D$ - ;\Z+f!Qg-!b[3>9"#(X9B-Z?s*A>g'Y4=!L3EcMNEIg\o7erPk@&LhpiQKn[gLFjQYGDnMX - @S=t%O8&G1`b*F@%$Ob(%:T6K-?_&jg#$$hVDohjWaBXspq-0+(c.&9teD2p_>CX2rU!LC[ - e6QQ$f&2QO-.F>oeQm0%h0%.mMpVCJcr\'%40c_PMih5kYFO_(AS9EqbLesbeN@?dge2\D( - T`mm_nDIOSXm/o!O\K5a'R6tSR-iD_lk3$ha!Dr\H$gYA - p3I*'g-A)f\`di=4hM!sGr=j2;njIR7#D8D0)K@M"ZbW=M2rIr;jHf3=0fH(^Ha*$)N&*H( - 6jo(D+]]nK@;:g8P+4Zu`??Nlo@GO*oI9k+Wh"0Eoe`#?"Isr-44icje.I0-ZefMfX*`(pi - 3NM"Tc[@q!]g;%mn*8^\epQ#knccRqUXpje^g+56^Ba3*C$**GnI;8T[HZtJl/]O*h`gSFT - $PFsOm6:,kC1>??BsqC43nsb^-3M.;H*0-H1B`WocGF'IjaV*6e&j%iYtnbrKm5M$h[jGjM - #0$`BX*e#>M'`RB\Fr4;6Ui=l.PUh[>eI;8EsuKo9$%LOZjn5J-fB97P[q]t5CWO9:_`Jb&Qj=fFp_4,:!.hs/nqc%lS_IkL]dBq'jOpSk_]Ghhn$DlTZL?6tr[i' - [k.]ZBe[.)b\dHgTpch&Lc7S]pW*nSdN`'1@W1m - KcH;7"4?r_ei`bsg*'Kf)?K<"r7+6jT>8)q=M6;b'X4]an,j/c@h+ehu8.;GqYN.mU\Hm/] - s`[-_W+\!:KfAC_%b93t`-rI[qjp%>"W>#pWp4MFTB%9cpMQ&fZ\en&g,e99@/E`Z:ARr?W - 47GVid[[dk=cV^`UG$C9gNI+mTNNAIHep[!neJ.](ITl!ls++3pIE,>n2AO2]gt-DL=(3"u - /W!rHX^uG-GX^SS@9Bn#OA_FI]9VAm`FFM[$:[s'k'6"nC?HIg07i;rSf)e8pjN`^caUnCQ - =)`PP@3N6DO[D-QW<-sA(iPjC$HU*^ol^$p78APRZ2lWA6S,@YNOXM;.jHDIK>:B3Bjp@m/ - !mL[;&8sFcGecjLr3D44LsQG>etf(6r>RqDD88lFu;.84k8aW\;p`5OGbo*a - A/bI)`Zf#ooaeM9"qVe=aRrNC4qpF^r@h=pm"KAUo[#D_>a^.4%AGlD'6k'?rMUZVE%LT0N - a^;mGEHJ[hkme_J-_si&&s3'q[h^?bCI6VAlpO.O@g\?5IQg=GGs/5DaIm<,js$*F^s'Q67 - J5@!_5^3M8?o/4A&2"2QfHC>>PRi@b7LDG+/I#Ua)hS]Ak;gFrkE9nZ,YF"b#f02n?#ul9D - P6\a`D5\ra_le$Uo>YLf!Z^n4*N)%fbR+#%pc1U7#'\06t^?K+oEC;84"Ub(mnVR9KlJH*[ - s1LT+bUC>)7/r,XGPI(Lin7JFRTG`:BN;@k:]?;.7j?(uH"$UhPgNXrp1nh&.ElEJUmF-,j - Qd*b3E/J8q#=48B0`UeGEZdIK^skntZiXF$$`[P:7,q]V3:Q]cB$84V=Q-6K=IOR`lVauM[ - 5jU?U'&lq"b\Qp@i9X-C:P#"_B,:TJ,qNFhF5J[YC/g]ksQ?%jjbXm4:V4>VhEuJ!#.?bNZ - I(,NL2EaP:UBh9m,#'N*d6i+`$DEo)FcaCsVWl83>q0'%OQpeoB$SG0Pjk8[)#G95p=>bG9 - 0;f0]?D@(M0KSY-k"T"jO(*aoth*>EO/lW9/E?m"VHtU;IER - [uPQLoX*W7:TNc2D9FoGWC]O`)uH0n,`U:h,SYLo$$tQRu8r85[nMD'ndlX-rmHa]`@(W4B - gl\q*04&ac4@4_D*Z2NWr)/#8FsP0n$?Ms;<_V6.k!)@E?jkS7-q`\*1J3k&"$j^i6c@Zf" - /E^FMM^8A9oP?-tcOR#nLY*8:c;``B:._D"MnndgCK>^k18@-kR,[)]ID!J-h[Iu(tdq3X]D - =)="Q*0'!9*&mG9hA0j531:A+)e7jcDT78#$1W!9aRrQUXo"C>')-0-lj>$[gaR[H*m$3TE - '&t@5tF3_)P_JicT4_f=Df+IV0'?9[#rR-O,Htk4SSR(c'j59+$:9l,:4^L@,ci!FFM`=ut - 90U)hAKKW(=X]2tm9;OgU+0]E^FXAIZ;)P;haqB`uCU=E_B=Hh.OTK]=XXXC`1O6j/3KrFk - .TmK.F0^ZiOkE*sL%$Hi%rHQD\2QkC`$'o5kYJSG#(ZXSLAgt9Q^N`asATUpD(tAl%R?=gZSXLeD%0gh69N_rW_A:MJj#pqt# - D#Rd8j@VAp!Tq2N%u056qna`i`]ug1.Ih_bjKQqS>VSB*i2%+m^0D#KM.kEB0P_S^ - '.%crh;E(cqCq[.\%^g;d(Q/P1N%-E,5$BuapnH#7]?XMX-'a(SZH[-hLuaSSH'CqUuY@Ii - 'sfgNVn/GDpp#2m2jY=*:KXd1Vh]A8qLpa##aI.+(6^_d^e_WYu5P6M%B4bO92R^,KB9Tt(Makkf3bEs%`_(3`F5;h0k7D='eP"&NXTkH+E[8CQ\d - D<--"^F;AGk4uNk([bp5NXbd>37hEuKoMk$L0[7f4##,(U?6bL0S];a=_sYUPrZQc58[n3A - s51)pkIk^r@9aK*6lRu#5cu@LUBsM@t]+,E7hEDrH'+H[(F(Jg=:NqEX^'N4!n%=R[86n4h - 8`/^O+MDLJ2^,'r*Ka3mLk!ULu04elF.]iZ;T!D%Z6QcAj8VI) - JrHhH-CST^PK[6:^1d7#FeH!Qj&FI(n1qU;6O5A+*CVg@NU,;4'h(WekEU?*)C;Yk1?IP/q - !o%Q%WGQ4/pn)e6(fLHC"5$bl"^A6ntURHT4SDY&GN%_O>PACN7,RKZZcn;>j4epmqd'u/qm(M_kQEsZ,$T=ms<4X!*K9>[$b35FQ,+Y(RDW=uoHhn=s^6"5s;lkdJH(q7[;2cHb=0cDmDkI - !Db]?C\pr"28Jikgo1[X9G0gH[lRYs/9"&6Xe)>Ni_X5/0bY5?kk=e24pdf/3[$^/MR0'Ip - eKm_bPA6VGQg!e\<.h7@s()$Cg3TUe,R(rRC>0Vgrg4&*U0f>D+:_Ak#5o$=j',/fEr5*SG - r9Js\>eW+]J578lsMqL>:0>8BR2`fL-_bcHT?c1mi_i+F\S/3!3/jaqW4ql8L"?8d@3CX\Y - /]fufge\e,%mN/C7?h(E_gFhG]#Ik$*K4CB/3USW5/QYr_TYut'C*L\q)[S/&8W1P/9&)p1 - p;_T&o.7F1jPt`HS=.;-R*_!'(%Z*g-?%#5cXfKr$48&LDnqU&8VTb]G@ou:.0YQ\U6P2,] - >t9a%.ae`^BI8b\Re/I_b;V73$Hg]1G#i)F_`Fap;FLC*Z]o - Q#lub_\6'VRV1$h96"=apD[m9!p46>CrlD$aUG_f>`6>/gqV;Y1DG//,ak\?n1@Ra&ZgEmd^uXIn#V\r^g$o?jQ47Zs/1 - OS-_["hV#>STD:qDQ:UcZh9l;2mHY#Pe> - UpI""+ApT=d*2bLWOPf5r6Q_8cnjNV73Jam*mU;uX6g<8'a_nA"jrS\9oD9`U9[[>'.LmQ\ - 8:J-bq2hi!RZ/g.Vi*`4-%aB,sIP$e"ntO72/Bh'ePD(:0N+p]Uc*o1Jf)*QRcE?`B@(4bY - s,nR&)poh(u@m+hc=]XIV`-XWBX=&_*@:[T,Lf/K<+q8lTcJ(M*%jX\`!Q;,jjfb(TUA[6W - 1U80M`'QmGfF/O\$H;UV+Ad/?F,o+/Pm7ac]ke%4%/D,\l&X0BZsVUV1MM@mXW!#$l*."hX - F>TP7M@mErn69f\`7J - 6,/4O,IjK(RT:^ah;H - p>/>h\&p7V=EFm=C4C-?9RGC*Tu<8:*@gNhj*Z&7J`j+ia,@U?H)SESc/m`m+t1ehO - 7#CH9bhT#@5$shGs_bU2+,m$"$F*@#b6EE_p-B"Q$j$?LA1Bec+Lp"CNPahi8:VecOdkfAK - sIiGKB:NYW]P'&e9M@7C^bSc<&&nmHnT@?):7('Z)i$/_$^@Fc<&V.hG^m_AB#0Pc;;2/CJ - hE@ji/8Eq'!r..&UDV$Ff='V:D-/_Ssqa^hn/#adH-#YWZE5mjT4$<2GKRCS\27MF#^_1\0 - m)p5p2kb;G<@bXN.i#iM"68&Gj,C#pg?),2,=\4!@ropWVFBB8sK@sehtmSr - 5LFQEA5AZ6nacc5'%SGN`Mk4+oW1:mJnJ3f\c*9i6"UL*g^:1jA`68 - \ru6kV>"F2kin*M?-XAIh?m^A0Od35i_H*erVYP65[ifOC*'6e7MG'1,@M'#C;(ftNhr>mV - WuI%iHDIP#-R4i,%4f[@J6tbI^5QRYMnmqCA+ZCL9#)"W+!]R-AJYf0".@+\*GB?@NMqS*0c(7,6lc-I#2Sn\@aD.u;N\QJPZD$>B)m/TR<+5"O"/j#*dHmQPsb"V+9#19r& - D0tf#RPBUnnCJ4oLk2p[Gp/(2&PN`a;>s`n]$Ge54RaXM!3.sn@':=pAe9E*cLaBDndE6DI%8^"7bh2g#!]gT-/07?L` - 45n)"uQfS*dP>YcAUB]e=E2_jcsIrEWuipM4iF6gnAi5F1rF)6/B?U+m_hT)"Ha,lTWQRrL - #7/!_*=.68FXWZDX[hoRO;_Q##@cKN5T)4FIb3X - G?^9tTS]Ua4h]6paD>:[_IEdWd_$\<8hFo7f1#="-4p!r;mr+8/hb0\l?9S;i#^J,s6jLd$ - J`qM"Q)X-X[9V^3Nqa7 - "Mc`IZFWIZ$_%o$nT2eh6*Hdh)ScoKE2LSd"D"sZE807IaAArY,.3RrJG21qZW@)^&G(#"8 - 2>f4.a-6s8MNk4N'/N0N:N;'8+;^(!khH9?LLTb%(@8#OdrU3_m)>Y1I&/:OY"d1\kb[dZ@ - #q@cBDeV.neA\,7_k;/;Z101Xu^M_R&o+Yu;;F2)8%9ltK8E0#\,he'u%*7++cXgJu&>SKU - s5'blun=Ask*=3=N@6WR(V?$uS$0BB`4d;f*6o2:l"moiD.1ac[-['WgdcrL".o1eZMO#`m - $ip>o/c6K6'?2'>PFLl[slZfjXm=BIfQXifFf(ES^N6ogFL"gObFcomC*`%dDQ`\/g`qf$YS - 7PjR!LDbJAmq?@f:Ibe51W0oMr?\YV*8PgI>9m?30UUAk;NUJ]kE\63FPV2KrJ&!RQehXf= - K3S&'t(]i>Yh(?7S*T34@)C2Hrp>Sa\_tR?Zsi:,)ogqOZTEjd-J?`,-FLn#g-Lh:7>Le97 - %u`OrqPL[BHG+4!D>#:Y@IgZ2kn;n9)=eOXsm%D?0i+#2GMHY1*(ni&b_#\D[Z$,>aDrg14 - 3R3.^XCE9UL*FlIc7F(b9Vhj`Kp4]Pt./3H:^Kufl-1#HVoK-cFM?7#H[H$qlXr*;tf3%,@*g-_ugE!<@0#1SAM_ - A%,G:"?u!4Q56$gK6'CD*hnm?_L-&F>-GF_6lc9$'I]\U12^iYX:h2YV>nAVLf.*6$Qk+/!%^KsD$q4VRW*)%;=ZnJJB*E4 - 6J0`SWh3B:Pna)VUXk%;k@u'aoOUQ,l*sOhL\QabH5A4U3TsO`U;(=:e9H - =V;oNH]>l8_DuXWO=fP&8UH6UU))-Df4PMUGZ=7VN#RV3J-Bds>LskrfTU2#`V9C3`Ec`A= - ;(qO5np6VcnU!N)+hUss-j7-ZoeW\m,C<6?^VWE!&qol?9q$G038m8fr=MQ><#SPa-uB<$* - SWn,=D_$GT]3qcYN3I'>KN_cTPDA8;WeYk?_n - =XonP/8[&A(&l3U3m2.$c&8n$G*,e:2.Q#BRBAHZf%K>\>jG[L[Piku0=dI$D;Dce8(?I%$ - [H[8@26:Qpm9/#PZ4K-a<=V?kS];5D!jI4\lUrWgY9,ZDWTN_f(EKXCTDYsh7gN;mcNAaMg - +V9_n:1kn?P.!I.(q8\m>@u,'#6HAm<-=a]DNUWNH\P"L8gm+/2%T(AN - M_8Q<(R/mICW)VG*9:qpQ*HW7cC)!i@JnTEF2h,'H.t%9/:ER8hKR3=P;;=&,G0%K8C4pQ7 - VFp!S[9.Pc.U]2k^;-YV=p&"fZu?c4>EWaQ-7GJ2X'EWCP=VUT$k3ao'*8^XS%meef*:HCO - L?.Flp3cg@&D7h1;g((<+of+(B&GNO!_>bLtW#BPcM"ZhB^8g7)G`m@CAf[`7(VgNRURc,I - 0d*oYnDT6"n@bI[F;m+kmTG]*KA[*@Xh@WPM.5:L^MVGU`P9X/suXogE@9tWAGkk/kLk;4N - Udc%X7aBO!a`%2prXqn=^=&(?em/=;tQAVlsDEU>Qf+P$IC:`rl2e_Td[A.o:amk9\@_%76 - [WX:UEXLjL.h=MBgtpKNSl]a=T+U4UQ^ICT?#DY]9]UUDU"=aYdAgPEl9(6]f<25j3EJN.r - GSM(?<]PfeMliB;iLEVQd7]/:$oVXeFjAheN)eVir"_)G/!(aqk^@^*P/ZPcF)3u%t3Vhn% - 89Ge&VA64lnj(`H^7Eft8DW[,+$bq(E-6W],+hI@n`,5:t*gX+#FY1%EHhX?7[BP?4bPST8OA95#`DL" - NT(*<&,-"DW;jsm!!r't,/jCM=T#-D>NmQ'O9#E$k`u\Yqnc>5ko0G55l'mK"E4F+:XY=Xb - X[a>"@`l\l!4-WjDYWm,>^Rh0HU:-%fT%3rM`EcaXmTCY&4ecrs.'SO0\iu6MtMa:2kCZ8K - A)`,ljlL!i]-COCCB;%$&\frifLZn;dNF5`madI^#:6WCI*0Pm^&:LbL - t#nAbJ^GTdX2q6+91#Uou(VVc@LhiMMad!H3u:kiOjp$ceiUq$']I[G%[N"9BGNX#2Irnrl - e]J"Mu-3dlJ5Yb-\@#,frE2t]WA>,3 - /J-$#Q@g[cjkr]A;G7[R(=/*YE=R.G`r6*6)+MRNELRDWI#\L\)5fAdOFh^rTRp"V%nHp9V - r&5g(hh<@%hLfp'[k1f@*gE`3O3SJtHR4u!6h;'*9$jI9!lpJL;jDlEi - #Et[qa&uX\%c3-=n7k>p9RdL&)88TF[gDI5E+-LGLEW7O%!tLG0#r63"1-6oS@3K[S-;Y9Y - ;/\*#R4"kBAqs5(7<9C<<@LfN0..NDn[q;rD]CP40leQIL1;r:+Dn!n-P=1n&JUbt.JG1IEr!e6aOZ\ - OZ9Z)m`'he9shDcTUcm7eEl9FNZkT[nYB&7^JFQDhgsrm5<4H8Wa0NDoRKqUJNdQ8^s#$Pj - qK=p2W!I1/sr%1r2\I%o!c01%_kNeGE")brV+98C\A2[4P)F0h\nr:pYjQPp]M\9/BP\9bg - /jEa_j&@oF)`1j%bUoat+ZG=o8=;m_*U<6\BbB1A.D7asS$[)Y@Q@97Aq;5nV%B>.?m7c?Z - d3^V+anm;@9F'?sL6t2KeeX6,3^KVB'>U'Iec]9:_93j8=+\hJ@-.qb9b=korVG>LI(#".; - jseS4nrGi.rA2[k-%V8tt-V0OnB'uPg^gEN - 2ddjjZD3kOtc78V?nSWOqCj*"&[_m1<)"9H8F&pV/DR463j)aqoF0=PG=%Y@D1nQ/M>#[K= - 03$iH;Gp%#.`DIVa%#!*HM-Nj>j'n/aFObq-MS4u%1o:>(B"s?C20QBD3D)#(R]DV@63jm' - Xt+nPBpZ(Z8XW+H8iHN\'%eWBm"M8*N84NeHL@8ZTLXLI<63PV4W/-*E2^qIJ<=lPPd/TIt - ,q<**:[1pXpVWZZ5`IJ.ThP\"S9''7onjQ^@GmA$^cS&MURLE-O*aEcbD"ShTp!HLhSuZ)N - ,;oKkMdJ<1L-3)>*jFau9/Jf$">p\A#OLP&ZuEEEHunY^]#%tZUrJp;]p\:K*rKn&TVLY*D - jG`Oi:K8-m[:`)WV=7oOhnUhYVK2S@&m*O>L`mq1-N/T%3X]![Y:Q2A[eVs:@OL]AOnQ?^j - 9dJ0&XL-\U9oR=FgC0V"9hC:'d>n#-O:=@6bl*U4gs&sOO#[B)D'[o)%uf0Ka&quKbo4cbJ - Wa.hNt%)3fa!RtTp'a.P;s)7bZ0i9Z]o8[dg_A%q,r]:%?jp/d90\9\J^YMA!2g%Q$FO83H - :E(>F00$Q2*D_fcuf@s-D>$PkfrufgV;h-^:^ER(8a7)5iQJ3L73:f@d3mH&nMA!=&:gK**Xc"RS:RAq]>!F!; - :Sp\IUm3EgfM///9PAZLJu-Ij\Ef"@Q&,_&UU/XI==$0K?@mE*G'\/)'[rt&M58XfV:oR]P - TtpOF%?)%L.!n">-!<9D15S?W1&2\3Z0qZbGppEWnK=$H@7CA4fJ-7X;[]r3_cG_jCB1QDc - d;^R[kp3\"FY9X]kJ%3r?&/T<,X852,1TRc-V;CG+?UB\JBL[/VrE?ua+DZ;KYWHP`tC=gJ - pTXa3?]]+ZK;6)E!_[!4m2gA.TA`D9K"ZFaPA)L6Oq>HO@3Wr"TJqZEc2L6l\`N#>==(u3V - Oi69k=SCpK&m68=Q`k0qP'\AUp>'$-8l(7^iSW&Q"=M^CCl^N01esjF6H1@A,a1Rh>RCQar - )>;ni/0b - .GR'HcNq3e"6Ij]m6s#gYKb!-bd50Q!'ls4;j@\T.j!@n$^S%F),GTXEU7Y[qV$'>Y6?UX]P=q - W2.D!Aq3aBfZ4KXL]n]J_m,+R"&>g+;fh9I2Rc5bYAQc753O3YE&bl%:^A*_Ba:XAslcTJ8 - SguZk1%F4a>d%XIbI/hI)&'n'BIN8J8SK6-a+jW:6dp4hZDh6>"%F^ile6PYp*:PVP1":UH - e@f#74O\t36.*A)eD4ie>liB@&'iuUeU9O,4^WpFZ-rS`f=_dF4a58d(n&'WfY%+3I21DYlH.eb3g>0Ts>q+R"^YIX\d=&FOh0 - IhIbL'VQeNJcH4lt/KQ-c)8h7`""I.>p"(Y)gkh#7E&?"MrbCYQP5gg.>?IBVX9s5(+HP^T - 7`hD*Qth;Z-\igl.`hD7dUcf,t)iOp>o^!\I'9AmNscJAJ\"2I`9bJR7[:'Tr(g,n=:So\V=ss"j@UW^8 - op5i5`5BPGURC.8/botG="`1-N\'8K*Tr$0X;T/l1BA,0;7/YCMN56CmMU.@Mjqu-E^iW0" - 05empj1^F*cKY_$baD(%(+ji9>*ZYKF_'AL6[$iWrNQL-W89AH4+co-& - OGRMFD^^dgVijT0Jd3us7\k*_2!T-0QVXOm.CBpO8Yae3;qcVJ%5P$,A^sEFg5ui@e*47), - kA]Y[7.)/lGNTV!+m+M%.5-oK1),5$M=?n_7Z'pf5Z]0YX\WKoa^LR@.BFW(/L-& - dH9DAfs;X#Zm"BJ\>t2E+3ZU1#T-97>ZXA_5n<1#6EHaXW6B27h&8:A%Ys>9qr$eZ38A_!: - @"g:_9-2oT:6[iPJE[s-ilpDf0hP8@i4FfKih'WtAjn7R'<3M0qmfnILWr_II4[udA4\fJO - Y_PTE`K:;P6NRR[3_(;=1!%)X5>3@)E)a:)aY[Ur82U;45b;O6s#6I/pZGuT#akP2A4UKT# - i&pGG%hlk,oE,ZC&6qc\]1Jd-Lor2N=StE5X5b&3Z.qVg[*>)5YUQf0NtfOSCVqI%Z;`[k[ - gt9Dq8eY&Wt@oXoQ:j-F##m$6um&mktK=>58D&YHcZ<103jCp8eW2l!DF"<+#_;\I(MAC9f - t9L7^Kb64NsnS!r7%HTW/fVJk854a5:((S!;8%n2o_"l8b9]*Z%Kr0@>BdD0%D>i]XNEj'jmM'\Xkj87?FW/_J)GQP - &P^Uc-%RJIp18_ocF>`kDHerGLIg;4'm,AYmQK.kf=9%Dk0g_3r;+m)'l/drFZM+<41Reh< - nu/6pQrtsNStdbn@f!.BJamfAAt[R-!=q]-*:Fr2APsg8?Y.f)GF&Z]2IS@e2^NADoI%9]= - LAgWASWpD5V$s2C?krn=t2PB=Y.&Nae9DOf$2U?KZ9GeqVFiDEHYX=R5bU]*7.r(98h'[16 - 2,ml=\j&@p4%6YtNFk\3Wqp^X;MdAs%=*N?jHsDfJEP9mkRHtuD8I2]:NbMO<]1-YGGVPbO\8YaJU"j\^ - QW(j$h`nI7EtJ?ppA*B7n3#"XbV[B*s-=QWIguA'[>$a'eU*R#ba#fS7PNhiA,p);+d>*3? - sHcYLdk%]_l!+Z@9@6e>H?u<0B;P7+_0;:%[I45\70-=6P"pUSf#39^s4$bAqH)gq_KW3iu - Ndd1Cis`/`d1V+nHF*NbTlX_tO]dBrQZB;56@#Rf6NlLOP:AlQS^_<1Nj&Lb#nc]4Dc<)u= - 2hOc@2gfXdCn6WI`u-3poEe?dnW@XHBtS#er#'OIbqG:d7b[b$i]?Sh_;Y#uIQ2D5W71+u9 - pC-+u=ADWulOb+jP4hXAo*1At(O`C']Z3=/f1j\2q!l?X)K(*^R8/mdb - ia0C<0Lu&&lqgtpJ - Cr>4B%/s=L:lD@+?C\`%A8hpsHjZ&o6@dK"'*R2t?r45!>p>-obO$qN5#?FABS#*I?,#TJad?ebjX9;s; - Z3HoOkE-p&MijO1;K#QM<@['O;kd:g00L6cT.6(l7^G^HUF?%g//6X;[<^6,HLk7@7)"_JG - ,O!u]40g>AYIUR$JK_Qp"]1uXV8]s=c2$L("E#.ekQ\0MebFb>l'rY7C#Z=,B'E)gq&@Ylc - :$MB._pL:,U.D:a5comF-9df.H#_7bp.t9^o_fiorV*>$),hd@_/U79c6`MCP]uOn\9fdRq - AbSmAY'=V'PDTh^V&bTaDkf6Yr0REc+Ol2Skhe$9J6+Jl>XUJE"aTIu2S$ - 8R!$sq;k4MQ'B*t_(h-(\dRr4ZN==Ak6YO-k-\KXS+BG"j_5ls]2Q%BH]$Dk/`D*SBZd.ub - =ns#82nSSD)Q'lm;5BU);h9"G&MrB8>9]dp/3\..FKtgo&s@1j)i1b6@&^\C02d[nQk38=k - biM3=DQ;97t]^2BQ]#!jK(mCQ05ns6FDqWiBrkMq]7=km3KVP_QKr3L@' - tH8uZug^>@6mHoJ72AYG@><=e3I;)r.$V!OQDg(8K_j3-3kL*S\7W"\ - FYkFs[hcFH?TAH6e-A'Wd=4r5]g@GG/ud?HZ - N;[`:TF)j\8St1;2Br/0Qk+OfG/$plogE1p0PA_qO_J.h06:$12GUUHj<-SbIr'omFStjDX - F##^ijVCg&%[u5b7Yfp\s4445X32^+ZL2Y92kQ(P_AW(VKP2q;cn+Gk)4Ac?Oh+fR49`nt( - odqO^KQr>ch\5/ - McWfkOn(%2?)s)?pDta1VD=cY+m\+BP_oB/?-rkMJ'^a'1N1\a4&ke="+.=r*AlPhTHE\Y\?1 - "m>X&AjuAT<_?2T]2W\,%DHOTqSce(jhsf)^<(^#/S4s_:/k/j;c#&*Pq@j_?;$ur$&ul,= - 3Y#_GhetA0aK`-,P$V_LsATPUaP//&J)56F8;\j=S7@/OKXn_[J39'JdQO1W(1h__a5<6oD - l(2T(2+6^0OIS2eE^42\Ef_jd6^bFbc/U6m,F\e?3kq,/kMUVSFNP%'-VF?7?]q`qM.^3fB - 89E@PG#JdD<653#)S.%Z1,X6rU_Xp[CKMTP!#fQ'9_dlY0r$oYG"i'+u`5GQhKMXlA<5)mG - 7BBTT]Mgu#=2iro6"8u+7^N6:<)^hJF@N>)5R_bS>][o$0ucV-7r1o?oO - u4nI7O2k71;?gN'AdC&4Bbk_6O_B,SQkdMAQae6mRT)Ej[Ai-qOLgaV-$n,`jdE3\CdSYi6 - "iS#3*XAiTq=\Ui?j6Og+h=t]A]-T_!`M5I>J[O@Te/pc-Qdi]/N1Uh`G-=X\.>bN[`mk;d - IajTZ+6Hc4k#V58>0m]q+,a6&aZ&m,O0!(oii`!so<]>>c[otPt`3["MS1kYD-2W4q9W4D- - WN]RD0EZ2b_E'CYX=/E'[*584q_(OHprR!tP.DO193j,"$Ho`/1?4ZlUnPtbY9:^"9&,o:e - .>4TQ`GHt]lMuXN[llX(3q_bp1`8\MEb7"IUm$]H@;UYP - bFYHJ^+"X\D,[9SiVl!lqGXc8N>gXthdlF(n=$fWmj4bKG4WKZ(+e`_2apbH1&(,e$NjPtp - ]*bq.R'FQB#30enlqW8nHse"FNn)QC=h5r=PE<"[&"r&S@X)#>5`>dD^,,J%'(Zn0,#_[`j - o9HHPO9\M_W,cMkR_^^>E\E+)G1oa..nX)?M->NY*C9pNd$Bh^AXur`2d@%0Ud[D)hYb_$@ - 6.Sh?'TD+KXAmai>&VTWpaL$qd,^E5$*qrnY-'6lOl[Z\')YV.cVbt?NTB(qg#bFO-mQ& - AX"#UXtIeFd6N9ie\s>S+T!cLk=:'qj45G1,1i9>.)VWZRD[M[XH`fdtA#U0UpP-`a'7-`o - 9Q-"L*u6s(aNb!hF;_4oT$*n)^:/_u3t*N`M9ZrFA7UJ3JsfpUMSYM5`Eao/ir26Nh$*L7> - (g3$TC$0L!M)^lS@0ZBkiXhNJZ[FqZLh+:-(!b@`[Fc2dg?$O[dRRS&KV85P-8Z0<-#";l5i+ngaI.Ut6pjc)):/LPW6u^55 - h=:Me)%(^fj2[rK]h+GWDagEd?TTch=+0NIbHrc.+7<\jh+W"nlOX:?U_!:Z0"r1:Y>p.>W - LeAKZR@SnZ?Vsc<^?F>n;s^?M5I!/W&J%"l[RI5i&1A"liZp5VsF&* - ;`[AR'/D(1acKnZHa`P@p<,P'J^Yjd>\^Z.cr-@jtcSXPD_H8AXU86%Qeqn*bf - 49HXs9\S/u6Rp+a!^B217=B#\1j#"iI5G%Y,n/'F1&qj$:@l3g(*<'G>8])QE2rAdehji2Q - *)j$S5CLupc2)](*;CgjhKkF_E?T(I**eELoD.Vg'kO*T*WXbnDF_32T:3/raSjIqLs"jrU%,$TC%'A7'5BAsSm!l\F[>T - BDMs;bJu_L3#@EJ7l$_l6rk$P?Y@7MeNr]A(GY^^9-W5S`Ef7BKepa7<2GOC-`=@6n3i4N/ - Lku(2Jm[VrMCr`3EseKaLCj:[pe4P=sV`5I'gUZmM)HmU!f]k2BA? - lYXql\md,TMh3OHk&2m5m]N1!52^i%m? - [qAFGXngD=Me$nUqPDcOj#-#;I,1c]"jaC73.l[rDPeaQC(blVXm@]5?F2aJJ.MI0-5+k$H - LWhU'Y0hTtBQ<&0q>8c'jecDo`iC%EVbSh/DOeuiRAGHuu^-Rh)tDO0B-YB,a^?ai,_2_]; - @P&lsDn7Hhk^0u(X;KL^BF1#"hs#fpD3bpB%oI\Cf7mPf>'QZ3&BGX0\k=B^@8b36UoX?^M - a$-V,4EBUJFSA\rB/fDM:@nc/oe;AIDcH@Y3-26@olicFY>o]m06GN=X%urBLI(-b?1b$lF - n\;scBIn8>P/M>obUc.=%IL9>P3JXo)D_`LMM("D0A-IFPgPO-V3Ko:j2Rnoo@#_Z7+""Ab - StdF_6I(7ko3h7s6h(G8F5$mqd.0:Z(&CpV0pVcY`F6@JB5"pRaBh%s[kn?h@Bko[eP8^P- - h8V=mE1Gh6m"#+>8L=E_G>Fq9?%[uL($NqgYNF!YI\llA1SEkdik44r;5TY\BeR`=E;D&cl - uh^oP"S8ukuCYR(QgaN!9ho)^h7oX]PUk!`t!.#o(6I]qmUduT( - qTl$/Mr]2Zk^+i=q]'d+9R0.CW;?u2qEMK9m!QkjY^:;VqVSN(YGZ^H\9lQ)HC)JDb\;G(R - 7=BfqM2T#pV"@<^;B?F`2CUE5K>sHIJc%5r4g*=GJue]bko/jH;n_Y\#amOd!QYSr27tjT@ - 8+)aSNZYI35eD/*MA6-@D/I`RiF_a4^BlE]NNaq/b9cLRn>nf_i4hrD/qQ2j_RcWql6)(XJ - c?k:+2R^q\dDHY;5aB?bb+`;\B-rl;^"5O\LDmsUPlIkRBa5LB@1n\!K1I6[H(:Y1)OhZ&Z - 4qY0W0TDSQuJ3VrL#S[mV#D0g$&4eVr(CGo8,#J'11)1OW_kJi0e06UhNQ>R+f^(dp,)sYf - E[at.0.`#Rj3nl^_IY'F9;YU4*56>LR`9!fM<*r[5bq0<1J("fHU=@SBJN2&&uuV/dV(D9b - ppCfXk'JZ$FN@8@B!Amp.HEX`G)7)XtsiV^@pd%iIDAORqoF%mWVJ!"?T$Sg"( - =o%OULq^uOfAS?8T&Pm-@A2fubU2lY)eo_VKL?ToFHhKV,/SnD->jmMtlg`JJU^W?-Dir;5 - ef?s?MDkl-lf5ItS\du.$oJ^^cr:rV)$h46]WiR3>5n5]0nNi7@U@LL043%K@YT,e75B,C& - &3>mU3sNE[llcs/0YAtJ_/9*?%70GV9,GPZChF?p;064g`6dQQ*Q>2aRik0T9Sj3KYKW+O7 - T!]1'ZeS,E?rS&P^*SJP'e,qb&3_r/kY^,CDB7#gq,GfZMV0Y_Ga-(2T=.(_^8'?FQX!)&R - =i\9@I_'3)3@fK0[;;)s%LR1c0,=7alam0i$(pof>r,XXQ]5OY%Yoc - R;&1&W%d'Loh9N3iK@3N_"/R(oe28#2[>,M=^]jF7<($.ejORfdr\go+'3G=qe4M - UjWPUD(+$4jg6Ql$AN7qoT`-i+>C1AE2!*Cbgm7o4GhI6>)k+@JMiiqY=jC'(AD-qsRU_c"=,&W$j3*MC=tW[HB\BgMN9AMn6`'(ZSqieI\PAoe[b - 1kMJE2$"\"N"Ip2QtpgDf+[CKfkYZsn?Y\$9Mu_pu?bqM(W"COK72uEdNhoeaiYY$'t8^f28p - I*ENoOG5>!/Sb/BUUY9p\QW'pRSf]9=Dk(Gl`pm5&2r]!Ds(B^HId\ZHpHF)7msBKV^Uq"h - `ZO#XhFFKpI1Bk3oelWujmRI:G0Srd5Gib`hqN7#Na9'-G=qX.Zc7/`p&R0E%-sNiidf8Sb - .or"q:lpNI]j(O6$Mno*i&XXY\F:aB;5Q:r"j\)7H$Cs0%uu"%X?>e%Dg[2lEAub(0O^']cmSm!V7a8jgZ'@]\5 - agHFi8Db,Ma,`l`k=0bh#*JkuJA7@D]Xkgo!R2L0r0S5prI[eW80??n."u,*e\(RYPoL9m'5d@oAMZ' - 4P[sg!(]f9XU:$7RKmM?T4ea^6NcM/BZZ([jREMN)J)E1'tEPj"0Ga'/G)7<20Y1m+J&\3a - G.!LHZr9a.+V?H_tMm[#u]p4S%3^W]8"ek^=4.di+1eH)1,1eI,<^G',De01VqB'pt5.8]k - 4>6=_YIU/?B*dE)>JkRA$!9X(7n.("^DETCCQau:ntg:f!3r/DElGuY^&W2=mB4>gG-WVM4 - _,Ej99WUZ\0KLn47R]`0edX=WnW2N[B_-6Bo=jLj(Uha6EUpEOHf6?U-lGC9>25337M>^&F - Oq*h$Gs']I$K*3[!L2.1JCuuUA*-2iZ&B11f#gOdCn5:G[Run8=Z]39>.$KD3lK@Uhbn6IH - BgC:Am0iE@;Al6Y>e8\=rVHpkN+b.FkY56>BOO0jO(HXWP)GMKfH3B>)nEmI+&1I@d]MOQB - fa[TPFjT%i)1C'K4TJ"YFts%?XK]B%YN>944qII([f(X'OIDWp\]XD>-*0>W]2q00R@`W3Z - >)S+Ro+,pU)RHAsIu9jOaroUtp#q:sa=Aag`M^_RjHeOnRQ/mNUef@KrW$MeQ-"ieHgHKh1F_rt:^\CgXfdd.@-`q*^B9&kL.kb1JQ*lmCdF3L\anK$eLWm"g>aFEs>nj&YO1TK9MK(6s&1:U9MW9bLLeO@SBp-YV'NSH=H(#m.4=9NY - /hsK.lK5&VkGqNPtL>0O7C!N8tI[es2:o@U2^*o!U`q)3/TK]`G@#Xk_4tY@)!+"fe^p?-Z - U=B@<;QW--sl_O<,;5%=>0kY-ZOKIpqS%B3Y'lM;*>h'5.8J]/+mrh=f$ - :gY=H]FdDaOg$J=u-&\hu.fS:P"*F#aK;WrHbM7:lr.K.%e8M*B55j9T<7]Khn\tN0^p,n\7U44]=iCcp:O=+HS7%i]$G3Hb"L@Us!^:I[o)S - M40WQ@?1,C]BDF[mjnc`G - #P)bPOWs^=TDZ/Co)++:V%i&eBO<H`OY+54RTUcD=nINjJ%HtK$J - GkQTmB;cV%dqRP7+lM.m'!Lpn##NW5l$C%lm=^*7'QM?nHCCOohWC-YFP&MJFADjc]?2V^<1BJeSoj?NFrLB](U)%#Z,L<9lgLlN<60;pCM*HDf#btkl>War3% - sV:h[JfD$c:bi6WPO0LH;R-O?a2$ZM4#Y^lr(DW3ZUP3d)h&.m.2:qXLr - i<>;sVb2t,6TQu4-7a]l(Ln"4,:kW[jVPeH-]s3AEH!ZfOSFF")"EbDd>0Z458iK?)GuAL0 - pF+2==g2i):>c/iu]6QQ7W]]0F>9/j&[./9,\DI*+M>U0tSH'gaWo2*MWcZdEs!)GoQnk*c - \VC&`XrX4>VUa*g,P&OprOrK,Lra*b+X\&`4\9&KgQO*KgRGOq/^5mit^_2!S-dZ99C04!X - :++&W[k1-$?&8L3jO*thR!;>h^p?R%=9-#qN^dRPC!XWTB-))o*7!+%5Ccn0ln?iZQV&e,r,!=1 - ,C@7o.;aS.l26$1Qs[PZU$D=75NCa1c%c]F%nMJ;)NDj27$:?doeR"AMu>Y2A9pcF)NtCEA - qqL(@sI$;SaM3/2WKD2$5QmdN9\H#oh?=1QoL"dhaI]D]t<9.^HN>;l(XX+":'R3mr"(Zb8 - D`\JI$?,SQk+'>l:4b9tc^4&SF/Ej6jQg`uF,4eilUo7&:=XZnVf5#Od6 - 3E-qI;l`8"8O&GH..h""8=B<]`4/N!-6r+DuB^`! - m/_eNJ!,N`"8&Gr_)mlU'Ip*nM(Jl_\B?e-1EDUnQr/r]*,@2r\7gkE5*"T2%:+G9G'&iO* - _FWo1cGB'5;LR:%o.&.gC+]"]8nF&GYjXT28BL:mCVKPiY[TaU?-%-ZV1s/feVchDDb@8@8G.Zg/T@kF^l+3Rof* - Ro!L7hB*)6PtbG`>?+MDjAg)iE2sI'%i.%5>89ir7gr,aPc9`7Q#HOkee(MMIc_?AajSm$< - 3Is8I_=5YkETajciFla#266O>tlDAYe82p&.[nkuFbhAYD3a6EG/,_'K15J2:6()`q]!6kg6/*E=$4-O&Y - h93)?qZ[YJFZUt[bN>Oa"Teh7euKk:YKCK@2@[^06435SJ>mrlffeW"BFqc\1+;,DB$Q)=G - EYtoQ3Ap2F%QBc,A_.g?7AJY($[c(ILQZ7-=E->`+(Ah-5VYlNeCc - SftO=&!7M5@q:bEYeUQQAnTs!FHXCE7LX^'fC%KXKhEupG\dNGmkj4H.U9e(38hD7; - b&jIC@EnQd4sLj_^@%F>00%X]];FWI+-jI;a`J^>XBp_PEfO9GV[pDg3bP%W - K=A<-\eSt0(%JX^ZQEQ*']7sCjVe]Xi;troI+DN,*\Shheg#d7drH<7Qa5R''*mLY/YT(`pjo" - (X@d%9WtU3-Nhi:Q[0\O``!E=3E5JNk[RsnG!<4\>PD^rogI6`=,.cosJ^dq%nD:Fe;Dh"PuaMZGtrK!B79,RS+lYb`_tFUVk)La];GCC)76mjPE8q - m_9dCjFfgn=o7WP+Qs':'H+)%e1P%I2mTDuK[VE]3*LZ__ST)]7b:'lcmtsiiU6t[sH#Uq% - Q'%-iI\dtGN_VWHer@O)&V1c5f6*#gI>ihNNOie03aJU!DbA[8@TSI`Wed$YClYq>;VK#X^=q@VM;kc,c!:!@F3LV'o[_`B">r - I87V!4KGQ&l=X:&;\'HJnm+k&EH5TN^*;ohnE'T*#0bEl#?26L - 5'#fBV:2Q@YlM3JGI9'Lp=d!Y_eBpKpt,P*$g7Y$@N/a_<;?F4:$a4Cl,*lM>TViS5I19RD - Yt._;)H - :gptYA-cUO8a,GAkI(dW!afp/,_!#$Z*<^WbpjQn7b=I)<4P4hiK?>TgK\ZmRr9;UUXjOe; - I!l[Lg_n+ZLJ+Rad6/%lB>;g+Hd=h;clCl_>l9lBWRkQ$@?daa'b'bq`*)k.qdE_[?f3P%sa)/WJ3$0'<'NW+lqhAf@g'B]+#jU<6k^3SqB - PNs9@EaEnLfc$'gVrrN@L7X+`I^7qH>O7rDSXtd8]PN_c11F?72 - .%6'9OCMa$A-3809SYZpuMY>P(-X1K18<+'nHP5reJ65(?-jEf'DZq*&h_pN0^5d=:rK.JT - -)p2j%&5?IC(g%W6a83^N)E_H7+^[tF36Sg/YF8nd65=0GQd2&`lS]24ASD%^VD!mbSi=tPgdD8+nI\D:UlMD^^q?`[V1(-CoP[= - >16B:(e]qY,NXbN_)*D@2/T_d_o@S@3>ZKZRYBf:*4F)kOoX1&>Z=ZP<_p6i'9T9ZG5Cq'4(5q4`C:Yu""EM$uEQU9`Y - *(&bSk)M]MR=YO\c3eTCJs7?+OZ/#,=q-BP:[sK'W!M,P9SI(b0qod1!MJld'lP%'Z>l$B[ - !A$:@bc\Jkjc_krm0FK`aR_F;3f+:Qs]?euKj%.J&SNB - SD'ZCqZ;p2j#<)cj+rDcg\btujsad4J$L*H=VP<2C+"=-YXU0@mN7=('W - ;"a=;+2>*"pf2c`Q7bDgbX_M%'Q'H7?eg4I5>P#dg?r2!R=`R`U7Ak7RQ=[O0h6md=A6j9, - c"u%A[@p+FfA1dmg@dD]J)Ahk$\$Znc51-JQ8R]Ii:j@qG?\-,*I_@]N[8`#=4QDr<;@k0N - SkP[/U?(&AefjU3,VNQ@2['BM<1%`Dj4CIG#b*q225Bf@J=A&HtSkMNM"[B:5+hp3c8kY;` - ;X.WT-#lI;rLo:+<;\3'NlQBcADfr^?>@SDn5?O[dBFM):$dU?(>5.`ng0tbqd=sCro#=o'13QFI_o#1p+H(;`MskC>mW - `o%T"Do^],J<7uP>qqfOQ4H\.Cno&rLE1M3,ccd7aA)gf77#rg@?!!NTp`;RmjKBVkLJ3!M - a.T8NH-_c,>s>s&]?u%sI_"L1B8Ii2*_31Se"8JIK7,o>/bZiTh"RDHo7(].YeV'@ojeD_heC,U>1]hZ'n&#(d:il,[F-Lr]EN$''l=RPCG0u3'qmGm9g%WFtinh6^70Z - j4'o1&tTpe\Q'j1**.Cu@J.L*8MF[#23lSo<6-qkk@PCW@^&&36[L(1^0Gl?@0aNQBgXf7\ - ENC2b(@>6E&[QTX7 - m`c]k%pVqhfX1jOc$C%XV574hor$@o/@ktNUaD4WR2O\WsXs(A[SQ?6/Y<#3)?Kr$YQSMke[>jGBiM):4p:`?e>WpNid$R2:nf]P_<(nibm(([dGJgc*!)?cd;R/?#FeYQ*HoB;JIW]mFCKFe)#5sa2)(&Xn/ - 4tDYHfH4X@/3TY4F8]O6%;,%T55Y:4(!?hl:$.-p`>cjC7i9+M4?4W)#^.(.%[>n/>0&&FJ - t"%*u4LgW%+_me%WVL.`r+JoQPGOgi(BmY^FNEX;@lP?SW3ut5R.&Ro2$!Q[G)l11J__9a` - 8Rb%>,4s4$GM`-Cr'-6R$4QTrbZY[&E`^:gaq[4fU - +,bh9U1C`F7-o2Bq%],nOXI:l.?#"-(ET,;=T:T(#^KhBlcChu6bX_7XJcLU"7-S(SKYJ[# - ,ZTf'Al+%MrUi`'o[IR!O>;W4KgV#]!a!T(>3%ieah)c?7APH"B1PV.?GO%#"NA@fK`f7pk - Md(0.:W0Zm'[PBt0'WY'`m\_mXB59Fiu2dJp<>ha&pk$C#Y1]N-G7E"'6[qm7F&@PVP3qfN - 4rRfE&hg-gQp/q@nkk$H7"Zp>[bcgP')&Yf"L=R"/k6uPEJqI:[:V'X6cjcZScqrbFO9ZFK - QR.G^bcQS;Xau%P*RL^.$`mf5tW\e]^#X''T]h7TMlK\pNScC)j9gA;A1\HN(,9g'=lsC]W - Jia!JTn,H^RoWS(Z(E/7b>g3='bao#@NXE/%'kg&;RqrI8/>*G7uSXlC#Y,Snj_hc-!gVE?4>V\)?oh__AXIZ26YXjRGC"P[dI+ - r6q-DE_]ob^:#KgGaI%E^"9`>3s+gD/>foBH*2]?V.4p#69:ql2E0n)0-WX$i%7.gH7;F]=]E%_i-u^rPEnN_@u(L'Cri+&\T^l2Og\T,C.5L_mSOl - \T?po]4SF6kpa5R60p'i6j5X,do*HS)Qq-]/RV_bsn4 - m^3lHhFE"qbRn<7;ao_9/'3d7L@O6r``P]bbHdKo6G=OZtW(`[:A5bNN!CW^7aOA6uK?6WZ - F?ODZ\C?n>e71[PaKW=Y4*6n0,d+_SYI6h&QjZqfMk\3i"[USURUU)+>6$RoG<^bY6qj+B, - TsI!+g?VHXK4n7Zs?>K\]YDV/_m-Z[*5bC91&Kebe+au.mQ8YE3U\!9euZ@XJ!a9Vo%0<8A - (,,bg+ADek02Yc$[.3HlONu:-f#g9jDs9bPn]`=ds3KbA=.NI+qL>:#)VP7$,)LLoc - 979X0/k**57%CoFlb5PaB\_h1J7oIfb;a=<7d<"-t)`uSFXYl_$=R1k^=PnA!+&=AUm./FO - GqiIWR&XQW9.!g$]sHudErcYbo7+_(XVh1;FN!2#Y)Te2:*',uN2E<)l(]#i7Ar0k[HW.=V;b[qP,qi."I+)ALd;;-MXT6u7- - dsqXdcCYaq%QXg.G)6mdHrmCNJ(3K3`Z-5;MBm&2'l@aNf3"Ydl!68ONZ&=P1]F>=7pjcjZ - _?dQIqaaf@-t!*t`XZ=C%M$h47KpQe;P0f;4#Mje^D5Leu&r=nS - (_[E&8@6>42le&ZC - >8;4auEK*]R8B\qB/g?K;=l)'Kh-:SA/c2M"':6WP_G.*Wg^M(_@IUF!aBUc*>cl'ke4E4- - MP[BP[doU:r5-:%NA(7R-3_j[(!9/AfI^=E/1o+;l<@O?d)etn?$`P&]aka$Xh7TsB6 - U8PXi8%DYh3H)T*R.k&/7#P)2>u@Jeua#[FN"_!A.eM1nESu/ak80LHKtLWdGa\^%o'`E8Tqih-?@T%I0uOlem - d#h4<_8Sc<#UiS_-F0J2@]Ei`Wed`2FFi)TR0AcCWCM-qXT?S2H+(%,H^'rk9oh$+U"N&op - 6C12Ppge$\aAas#K(#P2#>V)(Ejnn!p%:@h#&iB2#''WW.9A=m+gSK#-9hErHBYRMleD#^2 - %PGh_0?L:g8VHHTV@c8AG=NXI90D^f;dR[)hp">@iClm9:(UJO#"dTlc1U""o]fiF;U$cPc - >9%FKMKe0p94tW?lhAd%QhYA+2g8qj?ug;UgN!n,u'8Ec()7%"?,>1Qq?o.A6qN3c,DS'U> - J).^>ol!1b$U9B0RZ(:1VU\<6f&c.HPYf9GE\#)qdBum7>10`'hgEQ:k9Ve73pZj,RO/[Sl - 1&Nb(o)k"F'2j6tf95NAPIa,D,%XK(Ae1c' - AqjScCmIj:pdA+O5c(n7;BaXM.H7F\@^WdV`.(RZFuW2kikmcjU3+G11-#hVj.:BQ^/3rMG - KOM_BXPe@Ai").BBJ&4?Y$NRen&DV53Bk!^um5El@+ZTD"q=+IqIgLBQW;"e%Y0,I7fg5lm@`d#.SG$\SC! - :ChtVfZ^A7"Jq(@08T?Mm.5L3@=o9'g`#jCZKpretZhC2C7m9kI8cL4sD\ - @dVaOj'L3)SI!pqUYlT - U/A$>=0D[W&,UE/`'/j5FjHhrTT;mV@_AZu>8k&aQ%l[19fdhV7H7!Q84RmZ(Oc/B6e#2XV - (V7eCl=7cQD`Zu2bKD7&B.^F!q2+)KgFm;r#B8kHOo]h':O63e3AB&%B51,albERup_:>5, - BV"3C76XLgImb)U8.D;lCCb3Kd1-+aZ*:poP]C*p_pAm0i\+4@uAfc>@`a/3i+7`bJn\59K - f'`'_KC9!_B9XA%58IjT5k2$DingloD[1?$?uj:CoJ[M*k>Gh@H3c\\OsqH)1Oi1kCU`0(_DfdA! - F,uOZ-]7^'9_+4Hk!*_YYC?&WVY\=]E@b(,"/50"<-Y=%o\Yr1O-4?3ZehSRBrpr6IDdYdc - _dJD/-r8C,C/WIgpp,lTgJIF%"a-fuo)k9sf@/B9pQ8*VtXjkZj$I.u7jXjf0IG#o*CRY=$)[@'P+#r/V_aLcAQ7rs?H#L5dq!MK"a6Y"S(MPCq#k`G;OLK9EN96eX` - 0k,-l.ZASr#q1>H`.\Pd7c4LKCUDS2H?O2d/^o?+38EFKqcs - 2fmh7*U.t.(H(`2hUeV"JDH5!N7Tuq_j'5\G89dti)k-TL>S@&,Ca/>^)qQ.D7Y:X@!MZ*H - !U0Y.?WZ#k!=d_349]h>e*m6R,iNF>EW<tRO4B,m5`H<[ccB$Xep!)`c&HSRPs - uPBN`@LR;EmTVn-aBQLUSc]@PN4Dq]sI`c(Xe'?0J=VXq$0I#fqLmeM%da`(M2+2[W>%l_^ - P>B`rSFIP3fcKguB*N=#6D[FSQqd2eEpO-A;fleCfIGXYR%ggR(r\hsZB"YTm`pWQt>HkHX - dtHXW)NN(OfDZHS[J)M_n)3UT$hiO]:(d=\c;4#]J&]Iq]uTdAN - X9\cLFl8iQc*C+S-4?1on>Vq_#n(RY^Y_X"=WCJ_4TKa28s#1);$58@&tZ)0D5s?BFb7(*# - 2]hKlEQ'!<$$["G2`,"2TUi#iN&kLTI6lrYNA+FU[8-jG3 - 5n+;-)U=!?W)LX7q-`436\U0L`RnU<$ffQ.1)Cd!XFJap]-`b`pW,`(u".)9KW#bu3BNTPf - ^6AX2oj;\PfnK&4[W=!\jlunB8G!*k_d/mcCaFfGbpW'4D+X3._O:e'U6'rAui%.Wfd!@[k - .2Gro/=;Xl^+W#*pBm`JO-\.1<0p_M%4(RJO7J$35Z3^q@luB10reC!8R!@57)+a;C/Mskq - ]hm.Lm[d#8]F=X2'kB'PYb[E93J;IhV?;/1I_gK=c5>LHS/cn= - ERUC<_%X4SP<1g1-&6/L?S,H2`V`oUJ$adM+f&QK?p3!dM'AhmrS9oNjW+G-i0EdDso)S=L - L><,'T=GC)ba.pA`*Xklq?5k?ELXJ>2MRQPmmi[K4gV3Kf(e(:?]Sg>k\PS*!'MM1">,G;" - MjkSAN:K$HM0rEIGP>[jFh5[6KWO-QA;($o`W\m/CoNH^oRPNr=/R3W.uY'#o0f?4,"W%C-8Fo%EU.R`p0AV#+AL7d')K44!p^Tt:G]/cnmAgd0fH@Q'F& - n<_2"#Zl6De^J]p!ALr;0\O_[%l@g[eGV5McOc)esGXHJ)o:,@-BXEd/s2^&/83$$B45dH. - OMkmDtmjb%Ar>r3kdBd%#0&s-[Gl)ro"hi4#*.l/t-.?8'4kmi(-.OY:\Xo>T@C(hB^Z&MflZb?3X3aP9jDV05#4'&shkMnbU!IRVE*h - ]_(p*BpYHq0N>*e7>)K!9!hpc1tuR:$fujT%Z\`f(SmQq6Fc&*/T,7)U[dg8j_ndPdIuSQ0 - D0OVQD29e!`p*Ber8SFP`A#\q&[Q%8j*I$L?1[@#O:J7B:QsXjY.+;A"n/Tlj\O[(<;@lj[ - 7(oenYY>0gF>/X*Fsp4(.:]!03Ge9`uXn#^@L[r0[Nq_rqA9s_ZZ*n9-f_g,tP@BoNE - #N5KkIW6t:`-B#HiZ&Jgm_13c3;0f$rf>R?f.u]`#GlF1_qI2%A)G1U3l>gKm%*spHn^MqJV[R- - DVZM?Su(e-O-9lAD>46>@Sk?]LgAX6Ia"NASXG@Hd14j%4?( - "ln/UQpF/9OkH(?YrVs"XRJYj1%uQF]hC@Ag?8YH/Xh@B)AGIRp@Jd6ho<9KKp1R[q>HJ!O - I9akhT5QdhCQBu14oG/kN\l2lUjG:Dl2._ApO$oMAT(=0P(cC)X>\CcnGSD]s(cMn%lF*$% - )D=VrpSYA@ef^OD#q]u!H5dP&-VSY+Lbi.!&#o(:V8+&%03Rn!jAj'0A?N2\H$=)"E6'qn4 - a(J;"]oL/C8"CWDs!M@-eEBbqKk/07a3V`rY[P"/9(_+Voe=gb/JOO*57.^'r2Ekf-luu]qRTN:O(c]KOI"'E/G+PC$nu6#K3"@Z - +VAY$rD-Dm"-4+ndgKsJdncX(0eWJTFUHL9$OL>ud9-\Cd0D2QR,_k90l$K%I2$Z8PHcnE/ - @N*oAZsn\5cpV%&O*(iV&IOj=h?cPd>S'e$s<@\,Js5o[*1)_q")Dih_13>_3XqCk\]X;Mmga!! - 2E&[1:=a1WCRhTi3P(,<1Q:mDnKYnN8m*RZ)CafcpE.3pX$p@3$U1#!pn:r:W-+etAJZ.0? - T)'X']*)]7rZ>Cto_]H(mq(Y;V8LGj(E?EVS*cWn-Z0_,c1rJhA&E:@K/GC*Fk4hd$aH@>i - Z6Eikr-o?^`Njg.8\ju!gqFCnO:h26nbXZ3kp:?5O&4RF0nCZ,9dt(-.Bib#j'NJj'dYV<+ - S+D8nguC*h%qj[r@qX"d=!SYB-Hj]'b[&Sd\/G%r>#[>1G^H`Ecj&,)'CYr$LFN4ne!1RNA - 5GE0bX@99T:H!!u\Eq1f+',P*I.eX!eKg/s:,QOe"1gf-rI42f^o4Ote(7I42FW1,CX)'&a - sQ)`JF90sb:DdlSFf5m>_?1@kN&o'I67@i8,e4-4SFdmlIJ9.0=,,L\e:133@-X#RC*'sY@ - AbQBg<5ohcE#SZMaPOCPrAN03.2R>b8bcNf[NAT%"2q(\a;[5B?T0*d^1"45iPLi,VUF=G0 - I8[/lj$>1Mm43/Nccg;#&,e-q.!u-i%rUh5_@Z1XT^1X8\5AY]1]]C3"WV,\ag,h5P4'ks. - k),*2=lkUPQ+2&Y;^L>"dFp!oU,H\Db3p'4d.f>bsa]nFWlt]#P8`u<#Ij+*BiV/4-ZX/1i - l61Y=Fe'9XMD11"O30dQBPhS@C4=PC - G\@"gmeOrZDV)OZObdB`#.N)-KX&F,:9PgCD2/?/KD^Eh/3E-Gc;WCb6$!C+M)O-dG1C[Hn - fi&J?=&i[.kd^F&4['<+[-oG4OLl"Nr_W5no9<$=_ac8=2_"nMV*Lc?3Lf)dem8mI$0IQ765P`o&KR@l>\&2A9Q.-",:]@$ - VsI()LKs94TqB@eNB'p((^,q-l6bB$RAfQ5sR\@qIVXAN!h((0=nP+(mK=B(gpe<\7plH"e - #jAQGDjQC2@9I;$'?AepkMG(43aYA!W"Alan+]u_TjUp[DYFq6F(A3Ho[oG - ;k"qQ[sA4K6W`DsEa* - \]FHrnL>(XIM2c$br-ICIgVfAh;r`3_IZTGM3!"\VqP8=jKD95:=EfLds+i#&L3QjR3)tb/6$Ggh - Lhe;dpl1/FrJ@FbM-*?!3),+lia=aaG)A/8\:oNkqi*(IGF6d8Wu/%Mfo@PlZ2!:'\;uS.D - 2S,1M>39nE="+n'jdZ)>mqM?BcTUD!Khti[2%RAP.=#W>0uib%OhF?ZHHSInRP]/FVdhof* - -4S4*+I:FVc3@\N=YR:>9s`PaP$^[Ztc6=)5?4FP0*(fjA6U$'pmrEu.31=]ol*8TOPaQ5O - sY=\Y:Wl^9bqQT$F\q1kA`A!iS>R+\+"f!Ul*VfZ(2C"YY8\US[]!LQn^PW>/$)-*0WELf# - 2RMNB%RF.L,fpoTcSU%i<\`'+QMjtZ5ReAn0\auCnX.)-0SsfUs)?lO3GFSDTFIC+A(8IJ4 - #FHD?TNOQig&%!/EKrRBS2q7L[j.XD34.f?FTY0<I - cI];k>F,^GT3$8sJRF%.-NlV,Jpj=;9'qeIrU=9rlfA./>YtoZaJEd7`LsX.&9CHGHD - [u/bN=MHI8^TEMq9`8%T)0qY.-I$!/j<=*fS'q[Fr.jVZOC'AF.2%:?Ae"0U1fZI8I=gI\N - 9jf^OcYo:#6Ra\ZK*8An'1B$1EXSjmU=jlJ[*cRmni+-,%pY9QV - $(-UgW!E=u.(O84&2P8C1OgW&(]\Zl_*Y;nPQ:]eYY^H`9,392 - jS@\(ioI<_p4YM7br:kZ(na4/&R>/X>,t"C2Q8PE@WK%D@r6.(eZ[]A^ - _V9t>-$%^IB]e)a7"^Shm6^!tjXJgf-=A]\/QY&ipGPrlK5PrrL1PN7PM9XK_bhVMco=(g-dDpMabZhR%P*j$)o>C-Q - `g*)kqUJoc'/Q)rbI[GjI30o.RmPmR?SUN^1a0Am=#i=&\pY18r=nl$VU8YtW>mQB;G4lsM - 8rLIdQAV_%.?QhW%&'O^>o6"1gd)koqg^q%lMt=fd7k(rt#hU_!?Eb4]s?-Bs6$oX1N#c]X - QBA\ZD6r_V=n3dW*?;+0iMcdM&=T'IC92HeSC#]N'j1@)naZW5)Dc9m=kK3T+`E`YXr<_;-Y>'9qi#PgrSd/8e+le# - !iB?#*N:"(.bKU?g>5_h_I)4XQ5LR4)cb2KF]:1q-)(M.h=hQcFr13!l/<)i;j#ltD1Eenc - j/Y@Zi*A#"ob$@N38@e$l+3Ls?8*sZV+t7P\%YYur;Y7f=m@"thgG1\h,31Dag)tq>WY1;& - BKH.kMDf8jPFgg*PmhDp+,N]>iWH3?%qbuEMc,!/0!'$8b\C0s4PiZ_&dj1W$13LGHGi9]Q - K@kE"438]12]cjJYWVYN`P;cOE^)3P7dOS2.rWVm:Vu`B1m>0H%*$\),iohiIF5^%prSkJn - Z;f"@%NY[CDB_6Uce$iaA@ebA<,[/dsq$JSclr1 - Hn*C"7#p2XogU$N+,t";I`1LND+"tXKNK@LYqn.Oa:o9GKZh+4]!!3-#It/Y<3$\D,bVMOn - &D2([*>*rj@M!4C&h*m7`oBqK4;pF$M8Z3O31MHE'o#1&Z$\+'_W*BhC - r/1rTh+>XqCLnN/!3W)1tiA`77O#rUp3Lmp+oI9dc".d738F+Us`t"RK[Rp:lj8lF.,5VPs - Vf\.Ih`WL2m9sas`S!9NniTQ=)1$lE.dW'X$"5ep34l!H>tYjHXJo6A'V@fg#7Y^(2:T@,4>X1HmH>EN@_p1-#Z - ]>H+4NjCpZ8Q>73CPKu)">sF3jiU?V+Ib[[OdrbCa]H6iTK"L(;>Wa)jF8h.`02(s6]eCt4 - r?q&e!5Uqi,OYn$:im-:6'/Gfp-J0%gAsSNMI-P%bG734681Lk%)_Lt7.WYu9K2bI"Z/Nh2h[-]VDF)9AkajZ3`3`.RO(F%,r1pn - &q;I(A79lQWq5u2KBKeuWRe7fI\[$HUCpKV($"We!3pA<0?RC:XU#\Bi<[uI>peJFj0qg6<#6CEEVt: - QZcN>V4B9kPj9a.V(G#kiNu:QfXs:

qL/Ud9+0XqdPQ/ITo-G6]%Xq:"P(V@^qXU:M-^ - p:JfYj:7L9?P.ZGkO4F+r9#4e?/.n!q#(5Rr=S&9+tTsep(t1R:$h`*I]bhNb50#3OW@gB. - _,WO0dMO8Z$);IZot+HBTkWB"E]rU9lr`4)O%=r`,u_)X\E3CKg;ZZ/1n7_34*<:6s7@]5C - mA27kc*mHdo/Ha<'2"b4XSg8_E^(:=mebg:nZ$/_e1BdaqbhJ_Fr> - *hUgN]cSulpNk/`NI&;d+l`&U(b0L>e)a57%C$l4IlJe#UUdf - ps?oRno1&O6U$$"3BWKlEn*6O4tD+4N$#&?5[rLgpab6p?B&areFoGn"3;6&./>,/1"4"la - >bK.q<]6YIJS+d=pAd*HpqI#ATZ2T5D%,,:rZN7%Vo`CV-h,]o321+jkA)%@p#e8(!u - >"hFh'-nj!UQTT%6:1K8*FttJQ4g2e8a0"aj=G;90u@&7=@jtgUp?=bC0\]F9-pF9Y)s??> - YGHZ11je;M/rGj9W-lB)mL>;XA"eI2=h!?M]sIf7-:n/Wkd6a7kJe(lGL0Pg^%kX&V?F?]L - Er`fOWn`'>RO,3UY$M5@0+J]MTN\i3oj6:[tT9N6>3k(GD=4J4cFErkjpUO()6e%oRM1\Sr"%F: - '$ZOSZMRBp\p)ZX2C%T[&;$V2I.E)4`;m!XZpCc./H:VL%3gs(6ReNbO=Y4a'maerq9P['a - S+UrP3nA"=X0!/ZUR`H#VXlEF)S?WsH%F*B1`V,mI&8aFQ:Gnr0?eOQH=X6"Q#[ - $nF*l,d#l$]M5(G-]W?F&Zoi>I/Js^XNH0?Yl8TZ0sZL=m&"ZCdikj2+"O_R\ssR9c#XP'! - 4=/3-6`X]sY:\hV$'_E!o[XUnh1pgfjAd/B(M[QSRi$$\M#%/Xj5R1;2Lj:NgP?h0bE4B#t - g8-m4a$^!ZO'bIJbpVN^ql1'k*e2Anm8dNr'QDt - (-KLEqDmNYJVrOeo8E@X)IC'T1%H)*a14\LjLce%0Fg.^ESDMX/9;`8[&1rJB-HBLB:-!cN - lfsu,NF/+Og+gC`7\'-j@mm`nbu+nR@>>\%*P3FXr,DDlRYOh".uD*JC+-#0Z2SF>>(D=2C - A8"SB:8N+'t1=\k&80I5b!0l%LTEai0cal[UA]et;^5rS+b(2^_AKdJZZ]s"fm<>,(_)&&p(jjc)[.MQ*OguMhV$Z\"(^d - EJPtXH#i&WkEUJgU](TaM0Lb_YDOoOq(TY]/`;aN=c,%'ck3Uq/6Ybs^YI1f^qehml*Uc`" - ]m)`pi$UU9mN*Ih2h'gWgF$.n%LL*unj;&D1O!iq)oHm32V@*nIIV2HYfheFJK,2LE*cbLq - )YS:76?e+:1qJT"575>bDL2O=i<4j3TXLeT(Gd']=E[dl!4gSEp_c5qF9?%r7?k??5:C>f/ - ;W:"/kLf[F'=Ze`cnkQh.q>fK'ftm!A\goq%M`\ABf_]l17Hm_dTO#>3q0Q^;g]Ok`$*;=5EauPA&7r2@GH58DBPB+e?M?t3iaR$T(BP - N;O]78B"k1KQ`,uAj!VUPcbK5.j,%n1SaaqJcXL;1(_^ - Vfb/B^3;nren,_Mn7*246F2nN5!2$^TCO?[)-nM5[^2#1^cK8,aec]_:1/)6kD\D%79p"5_KcC6o%"i1I38#Mid! - bF%X=Y2]0au5"$X2]K./d-c2R:6KAnHbSNRDbJ.!)55ZjgnCg$&qQKtaMEBZXP3j\*M&epo - 00@n$agN#fG.Wr:^#IBsUJVlh;Q/=LVS#1148m"=n3\r%Sq?%+_T`O;7#gGs);r*)X7euH2 - @e3*WESl3_1T:%Vo@^u$liWagg%bh@@caoXlH4I<(F^'+"a5X/`GbO'!K)uBc,&U`iFM//1 - j/?f;j!bR)7/Yj;5`XnsTlV$#o(I!I`!Sm)N"m/<],8`*GRf;(NT;%-1O-S6`2!JF/bCg8\B8?XF2ON - Kh>mJX,MtZ'TXkmK/[U%8W7W2<37beAu\7saWjR%&s:<.508J1`Y&,;XJ3jPU)p+Lb64E;g - j?i<]#CA\9>dp3X?i3fA]Tgb-j7=U"?]?D\?>JA4aZ\39(\&tJgSj-7'YFYRFfC*nO3"DS? - #L9qN/3$dl&H+(kgI7>h;K)W@mPgX1ZrQ%&b2"P=WoO]2[KWA<*T&Yd\G8]9M'nCmi;5R]5 - %j9WW&%<5hS#FY8U.\=CUT*4N*k>Ioco#]uV/AATk(DPmn]W^OQkOp4Y>,e>8h9/M(Ago\b - !LbZKMCOOI"IJl!/Ea:cS?8smn?j2r?R:)r!7 - 9T%2]]2&Qh93h0['ZcWC"0NX'crCLu*;!$[od9%_R2hchqOl4M\PXX]:'CE\N2fY.N^c_I/ - :u\S1"FU/l;;+'cTIEig=O^DYL@V2;?Q;a'f*iuh,;c[d8]S_KO) - k42pmUL;4NcrXXQl5,K2eGaiqr09[+"#eu(?$`9^1B3r[(ieLgtu9altZJVHTlhT\r8eQC? - uSH@0?37B/l<"0&Zog2AI8l;SH;rhRkSOZ5!4jM8]:1Z'-XXgD7?HseEdq%dn"X?o^3Dn,BPM\ - k5[1b=,Z;/>1SLlkuXHX0!mI[4G<8GZMbBfEF1b71dr5IonPue"qLj]h(tq>u>G,`TZ"-NI - o1c6dQgA;Pc_+eE9B8`Ddj;8Te1gD.cusnB*V9ejQTB?$HsAOkI,_eToI4_qapNeWc_14h82sC.^;(gVdpW4 - PAF=W*+PrM\X[oN.Y:?bYEig?-JPhIGPA)e^Bt"b9_>a7H)t^[73;khEuQaD/d-'`M@NNnOBk?DK(,-0r]jf#k+C;HSb^J=H=" - !sfCdMB2:TroO.EN`>+Os9*6DOb\_[bMe4mrCd&S7Q*0>?3#_?e+[-XZ)c - ?3oH9UhaS15rU=+KpKd1]?hBH=?-;#Q!RR\LhOYA9L&TDXq-Q#U=K.Ou"rH1B(/9US@K`+X - [K'c9`8?"F@H@5*V7bhJlq>jmY>$"a>RKc@6fTQ[i4Ro(^*Ybu%_W#Cq` - &oAF1c`2?\5!d!^tf;\SiPE23l8B?=?$^%PohFjI62]HRg\B6#TkY<*`L0EdFL?>!?k`,#nD2;d&B%*VpB[2%?Q;?)g?G*ZgEA*6m=eg?et###JWkhG2n>P1lnrhH!h`8_8$>Q1AO$&CB96SfAZYlbFWRi - jO?W3A'=1X;sT_HWm!2^W^N1`ibSdhuot3AEk(1Zl!M;I6[V[-N#]V;jQ$RV$>M?u$OalNX - KW;_#+`%dVk(l`1h<)_Z";Yj;-9lXMb.?F+Gm68K+hlk;d%m`92;Ztm[nTba_Ff#=D5X6\' - @D!&RE(:*$G6[Pl#&on6n= - L!UV[N"'%.LG0nAc#Xeu`hoYNd1rC3@F("]8800AJ)5EBTCP-,no"(X7TU3o6%\lcD4u_*" - dBA2pIAo?BAOD!71PM2$RDS'F-kP;aj1nh$&3[ii8ZO)cPIEPo)q-RD,$>M/R`E^S7Eh^N8 - GO@FTH4:AcAc=1hLS+>mmErL4Q%>"(o.m0lQg8o1NG:N/Z001a0o7%j'O#"6>3P.b/EP*L. - 7mUWih.U^k9t)M@^Fr&'Emak^F?^dd(FA^;in8N23r?]hVE/gs4S0.IoZ&Or2a?rt)I_5a< - UW%k?U/V42t]('o2dhlZd!L!K5gnJF - u:QFmh,""f7,I=*Ae)p4loE(JXV$@CUL4LLKj/1j3FDR/(/&!*TR'9SU8]"r0A,rVp5*g]2JZhW3d"Z?`_rtch^qk>@pq6GHOtRc=tn7?MD - NL-dc1S)gS`4HWS>^rJZ(Fe4PdoqtIIGkJ7#A[X'OSq@Yt,jH57s's@5=3,Q5^g-a/-'JH - nm9%Pfk9"R;D:[/s&]!Z+;4SI5dE`kn@5'G$,!+9'A'F']LuAQqOCL3onGS7&SG1nqtA?X% - n[Ok>]T7RPQ^i=Qn8h"a8p5Vq>k8$G@e2IC@u[dV4@R-1MRlW#FmRC8(KSI_o_L]dB3C^akAE5(Sm)<$X$Z)jlTNB",h-T%s4Y0DlNn1cTn9`VP\4,3(5&"7tDZ&NgDbI2pfM$HTku2+9"@0+;h6f<.K94&`L$)\Uef1KacT(6Umnc>N"n_Gc[. - E37DDX]Z$!2U08Of1g)YDl5N%q".Sq>ut2u2M;"jk2[_-0Q6,iS:DQ?ql/V\jLW+7sIET= - J[e-0,nLmd'cFNl.gILZg2T<7BQR;0``>DSgV/)QA2/_E"SUYX%2eJO!mlC\2A5R,p6.sLA - K5lfVRr1"Ojdg;lYK_rQ*J`24rKh]CRN4FHHVKc@/_,g)hOCcqC](P$=,t*>)^&tD)+1*Adb,SG)L\^_j! - ,nHJY#fX6k4odWQ+_?T:9bODZ/$C3!BAS)Y\U(q@B@aK_6?qV,WB_m)'";$CaC@G41.o6Bg - 'TNn_R/YO/L(\%;OsU;1:MNV^P[K)Q\;qM;Ap\0iZ]'OAX2LC]XW^3Hsc@Up@%NtnTY'#_5 - O,"$sDQ38sr>61cP#Y$(cqj+T\?uV[J^A!H!,M[/gneNi:Lh<,%,"HV;47:/t&Gof/o0I&"q]Qd#; - 9:1u3lUBb[:;u,`DOUV;Ge>A)P$?J;V2";oW%[g$0=\WF<2lP72VUKYHA8a8T& - 83L1QPp1L^)Sn3Y*EHX7$Cb#;ik)2F+IUZ\Q<$$"cDrfqTiHuXe_6^"lfDlXFj@5@2$ZUP- - $$6=%RsQi,@@YD7RDY63*2^[Td>KqC3<3W0"L?Vdf1O&:^f"MrXjP@0`F0C;\^3;(#=o6*`jc0V4V^B^ - G3-d6^c1o,"*s,O0m==[A$GKV/rm4lSL2W(Y]=<%lT^28sE!@`.QV+;equ_lG7O5[WRgEN9 - 6\OpAQbh&[*9%BTIPI*W_O1?/hQ0;,DcT9H(oJM04AUtm-2b`KF!ouVQ[LUE!nuPe$l'QA;]M8V!fo'OH>?G3\=hbDrhBV9e+J - JPge\f\pI:(gHS9j/KPOONaT(;F=^%"7pW<4Ej5j"r,"j5sc4eM]jiY?0NW);eH86Z+4X[5 - ;n:Ptkh19Hl09ee0X3LHY7H==GVtAithKr%0k<6;\oc@>sHdbdXrXZO250r6cmuQo8#Klf` - )sVaAL[9Ic](t5bm*qZ(npSj>r);MAq7i'erbpWhIfJR/J%+m]GM<"&L\Lg5L%@FQq#8#%q - #0ZQrK#>+009+$XSNIV!)L!$O$4"Ro\$Y[IYg(BlKo!cUj9OE1U;M"WN6!Y? - X_n%At1@g2@dp[F4Fn;@26K)cI<$1NKJd&dNaP6S7l#4PIm:j!1#UC<6T$uf>I:q7#(VZ6- - "eH[`:&/%-F6OhE,$W,F^d(9=?lNkl+$rG[0%p8Mh>$hi;$P5B-E.n-#fa7.n!0Ff%Y_W'TjID& - S2<3Ba54f'eri*d;'E#>nXDj%+0V5n0&;sMZaW='N$Y&E2OL,Ii5I>'bR\WEMWMP6P3.g)f - ^-7&W%H(P8TKY(br-#0uXPu],`WJ((m;]Z&ogLFWOCC)0+gO&PF1-N?;$B(ibf]dK:K[!>A - bml3;T - MbTKeJ,Uu-ZMf`f(b-F\JD(?mGcG]%.0L"Jh-12W;`R<7qEpld(k#-M,Nsa^+J:rkl.:ebo - Y$sW?)'kAgn-ua.X4Z9GfdQ6Vc:8Z&P*mR$J6C$bh,:h):44Q>jR;J?.k?"r'%&3BeLU3HE - RMep&u=ngFXPV(-Z[fgZGPu=Lt%EIln[kkdb*tcY:]2.0Z*HuP4p[`;SJk7.SdB"0*WbHT>#S3KfLbdn)E\aZ+?RUlqA - s;lV.I)V`:B[:i[t%Il:(dS'!H0b&C\F)*7G`7Jn6GpDP!12up*=t#OjE2$TVPLsj'YT]5F - +I!s6'G!KO,]M6X6AGS-P8?Pq(I7UQ6F7:VF:U[E1I3At6Bj]%e5&CF=$ZnbE/[peoMIs)B - ggH:6r[qiPZUR8>r.^h7he6[oT_qrRmGPkZP96*FK - %d;01U+W6+"6r1i#``ZV/I@8@4"D1oF!2>=0+KckOAlP\iuKh(CP37b#OS<-q4O^IcqS:Gf - OP'\,sc_,,6'9Q^kcQh;KU)U<9I*n+[u% - ,;cO9+<2EOCM,Psd;Y9]^PuC]5>cP2!<]*lO[,4oiHWCk';RE&jo_VDU.9I=+8!KECQ&/(T - 79J'8Y7tJIFamFks&X>=*U[D2-X8WUKJ>$>SVl`[0obFd9BV==EVege - K[pk'3#^C??GF6$a7@K\W%CP?:7''j - Xeh(%idY(o=:E,,);Qh'.>P=o?)i6+$43KpsderI6IaKQ/FAgOp!B;Ykg.i-_MLf]fT/]e0f - %2!b(CP7a6n>`1TU/f$QYCPbNfnTtE].?LWrBYQm7Xc)4LVS(Ha;eP\ND7;P`f%VdpM. - QDFD:Z1>GCsN4olfULEHeBGQRR7t$$[6;FB=ZRQQV`@N(S0Fo]D3B7#`Fn@6SiD.b:dcD@C - [Yd:.=i,`*ZkV!2F0"_-`dF70?[[uY`nY")NbHZiD0N[X0\:Hs$7ATmBj2P59DaaFuG4NQ_ - O3%X7&0^d"dG&oH!=4;g/"anU6BUC"2mZuk`X^sGRKBPm\[c;rTodF_9Bbo_sf0a8-I4*Wr - LN_9g#K_R9'&D/^GVj7+:*4bIbBoUi/,/.](i+Bk4_P+6090%T"I//<)iIb=M,QQ`prZD-W - JGXu?Zqmnm@Gc:7q^IINHbhf(t46,dVLlLEB(jUZPA4(lWUg/Ll!,8(US58@.3M)\Rlpt:dSpPRWGJseQO/n8_mMi6Y,Nu6 - \m(pB16.lhi-5WCM^p@"=`3K(E-Put_.oG9?:8Ua"19K!9.oBfs&rBBDoQBiPO\&:U(9n64 - Rj+L6D)!'B&d?qt&&7jaZ\Vl2%aBY#\C\[3O74XKIAQ7=bO*NlR"[MC^D0>V`Pr\N.3)P/U - EL*$VI[D22q&=]a$\3nKPh@>B=ok0/5F%X*TB4=g#gIBMAMa/RUJ6l81=_fEr]lmhJl[l*, - 6=Ij.A"+&D`Ms6ZtPeOGBLErP%^FVq1ac%D2oI:U`+#O)04NcO/2RAM7.i'qL&prbEh?\OS - AiEH?5bteUtGPAX[FF\h\,gE\r!pVY\Dq]*YN@/U=oDSXP&5H;U>]\Qef:WbAB*3Erd - 'XEgSCT:5GE=RTaGZD4iqSD"L[.e0b&bC06#R<.;/mpObRj_(plm5+>aRe<.`s-oh'S@1!- - M46c"LPFHVZPu-0HA=!'g@:VEZ'adBfL_GL4fY!:XE*L&XbX+D,t<([B,ad[3]X> - ajo&[l6j(_ljt%PF=YS5!q7g,)U,Y0.quOF!mB - 3GV3]I_fH@r%urOb2?[+B#Wg:b;@^U9Q9_R`s_gDVJE+)b>?opco!qtb;:[,,%dT(t%'gIn - qYYH\aP]_e88qr)RB's%5s1E9&H;ij`/3GMaJUkQe)g?6Jg*F.AY`S;i]Gkma)B=]#_`I)U - 8UFT-O`P25U^\iM=!gh"=h7:/RaOrS\]T^8rBuG@a6ckWM/"0^I`dD.#qQI#jdCks5 - NT@(,Z8[5L=g2&,I_0I+9S]bEn'LrDQ',oaR'BnP]3S#*5]67-r*-%g`PXbsPFiqNe8'lWL`uSfjQ`J[X/^@X3]R9%gkoH;,o@)I`L0A8g>U - \u&2l5;"N>Z:Y]m[,p2nY;4c$aT)>i!NNgDJ(=5p='_fTrH$Ll42+qle%CCc'6&4UIG%l%[2dl4?/a')mGU3XLc=.9go&@:s/Fi - MC-DmHrN"R6DbAg&inX4Zju/7u-.\T'j1Y-?=G+[XjbFkSPs'\u*JNJ-QeQo$5/"ehSR%gK - fAROa,Af3>dfHj71e*N^Y7UalJVA1 - o=D+QV++ffo3XV24@8%F.'E#EBBdgBG8N&reEe6;`c7BY0X[*`$2CLgHh%_BjOnB9%-%gB\_n*l0/#71j-?LSeIFj?$NMoK - X[#c7hKMRVKKfi[qlhibQ\Z>j\m-NtO56M$M&:8:+ILu`Y]D/J#`DUmUPHHgonA$3O_F1_s - ZDgSMDm^N$t^6;@,d-gZl%Nd'f`oUg=>C*`)Vm>XW48eJiC8]kJGIk4i-\jGCol9^G:7&`Y - io0`MhS7+#oC2IbNQ\'o5ONmLVSA3;jT2ECe,o?Zb#Ar#5Rq#Y"hi"+@/@\lbT-IGn([dF6 - r:fD%mR_$]Nal9$@.U0f0MjQTE>h[$N - FA1;ahg:/fV-36-),%-l,["HPZAPJjX\d8M%F+j]f!rC'TuUm4O!1VC%7%+Bo%9ZhGsWCGA - nFXL2<<:UJk;fbYX:JZ+U5:];?SRX$A[2eWgc;i+X,Z?:bDbaD4*=l%JZE5E5ZrElg>tGc) - q,^a?D3%dm[B2M8;tM@4ADDlfG#oU@Nee.K8AI<7C.m-oSqme@+VLm,N1Uf`K/f]?'09'Lk4BC6Y0?c)3E%I).,>rCH(F<2fVdJFr.) - f,+M"ms`F'uhs=C-206UAb);eRNp9NjmS"<^?AL6cNo&Z$%d%>1uik,'Hd#V8%`4m@0Ui_RH(Hj"SEO0$\FHtEOFs0hH%Q=DQWm+.n)r6(_XE2OEJ - pf(a,"!UHX%0'qiI#;T`>BeUrsSi]cPQ!+45FE[ifQ`2>Zo=mLK_MJ6$W-ijo&Z`/Gt_>6, - N"UO+/^1C.+(VOs-j.fh%M@mEK7OY;!@QYKX&8=n[.'1FY1`q?(c8TJLqi[,]g<+Mro%hf%GOfJV_rf$I;@M*DdnS`"-^'joP) - O[g=sZ.".2EtHkDRLV?p^9EaJHP;RZSd@(FaPHAa=N.nD[208JaLd/6QU+Gk - \\d;Rr-"JQld/$jA35J;HV":E:k+5MMQV$9B"I;l9=AimJ".M-QM(c\&dCDJ"(u6F9%/*TJ - =)C>Ao@'R8%8bV*!>B2&Z]NUAU-\&P+)>]#XUX-P5aP28W`<5_PfATfkjpqe/:=M+;NK*.q - _>.2KriW2W?mGP)e_)%YAqjM8N8"%A3>^OY\'01HB1^mrKjd22M9MZ1M8);L96N.8'K-YBe - !t`WYH"peN3@qmAsN`Q+_(MqO_$XrK"Bc^6pDG2WrYcP"(B3Hmk4#bLYj:ETNhu:6 - a^/&BL$8c9`;$M=?d"4_@(mn$Y$2cLgM[W=e$W5d6QJm;H&".M1W(Zj"6<+!LTVrn_78A-h - eBbWYJ)p;(V3"4Ls!rG[Q2:Y:Dm`q;%I_#)RR#jRUg5KMm0'&L3YEp@JCo;1E@jPdK^?Gm! - WPfAm1K\EDA69iKJ=@K$>/4!o9=^P,Pf?c8b8Lk=buSnLa%0\jn8^*@[_N5+9NkX"7n.%2\ - 4t!f!#@a48A\TQ2(INUIVHeeGc];gO%r1NCA!gRse\I`#mpV5>eum^dqU2m[84 - n\8&6>CjN^k(DMp@h`hJdquG1;m?0-K^X=>PI1&Ih&/k.dtVYU\?6[qS)q5$XN@E;:Dr-h; - AS3'CVi(hDTFb_7rTMB_"C.rjrCRRAbp>dq#<)(HIIJhr`.#d-O\D9+.I=%@eG@Ni#>H=lGNTo![Y+3>!F0TlU75XkM8).B_7<.bK`qSpdaUPGHo?Q - 14HA?/!)gAks^0f^nQK7:+hnF9jrBe"P2XWVtZ!>n)3qg-F\rS'$D`SNqFs_$ggE-athL.@ - _SE!EE:SoN;YM4-!MLm`4aNtZpgou4K\^+L7HKJ`'TT?MS1047qY@$U(0*iI"FUm!b;BpQ!/KHCD&,jYtTa;!6Y_n#5&+;J#Zr#Oj^&TCi)fAud#;lei;Inc),BM - 6mNMI)"R`J$6ij53(Zf/,#?Gr1c(J^ao5`Mse>`UH]Fn[T!.=j8QheofA$/5cWa,;tRj]r] - ]*'^.\a#g]tV^q*;k%]3Fg@&Rn$O&O=P25I9jo_T]cIg;)bY^SCrpg&42ufKO*m6!P?pC?3 - .ApHa`94u=$>;u]*^%mhNU5@b_Lr$0'8'#(Fa/o0f:X:W4L+$YsW6.>m$HnE4b$,-G/_:0h - qZm`a1.7&&%_R(1HlnlOgkZ>62WpaUenc&%`G.g^A?2BbZ.%f:.-(.^PjtfN*Se5@QrgV4Hf<5Md - [Y_40H2f-Ss#WPL(J2bU[FV]b)kM$sYgJ?+:k5\)]KTiOh59MFRcK4&VY4C"fq@3@k;Y0V_ - ]&q\Vi>cH"FP4?JG?m!kN[E6&Xq\k6G80\eD4FYAh^UjV - t4?LDNUJ/9-Q,s]Y-gZi5m#K/VU.DAG88E7Po"2t"Kuik<0iXN3ZTbm-Tu`1Ea_T8Fr1V2( - VFV,Wa.ob-e9f>+PKB>ZaXi_"FJCZtMb57J8\$lQ>c+CbXN;`[8MmTm$3RgaHq@k(8$oDA$ - ^n(qX%S,B8edW6e'GYUKhKc&s]W?_JU@@:PT["+"$P3`g$n - 1n4i9q4NaUp5sO^Oco6Gf1,BGgk&%hT2237a2tPK_\cOd+%O=UNC#'?sM#&/#.,c>;`>m*j7=hiUb>:5$\_bjJ4 - /m##&k%`%^3o]-Seim,3m:>F[MAF`M!hG5-P:NY;d#l7>=qbN=@c]n=Oh"o@8p'oOJ:5niV - Pl2+Dj%r/8c=$q(AH5KU!DlJU:"9?l2$hNf!RH/m:fS!%K`[,Gnr@u&:9=cHTZ,4;s3DDO: - c-q"OY'D:b#%HHc3V85>hKF;&^[W3&%ra87*mS4d76Ph;$A%uh&Xd@*mm\':Rr_f%4'5hk> - ;MZ;*?4eXXd.p/5a@0d^]f`]b4/0&^]>9d\S?fo_$S-!6sUsB!dZkbMF[FTC4Aut*e,:O - kbqRW&1XhUP<:HDVI77,k2Ge6WF%Y>1%]<;1USg.GL&#Ilkgb - 1OEFc]?Q["AOi692?T`*)EAKVdP^XAbo:EKU9YDsD'mneQ9lH0eF'"a?f.CqYolJ_2H.S$nfA1i+*1E,rHOMcR=<2kB9mYEeOOm^af2[<%V0 - Q03Gut32V?MJ%NIod4M&m>H2mmSE4bVF@I+[8(=T"@b[=),)K38qF=QP(cD4"EOLY48?,"culPY1h]ig't,b'oCW"Y$%m19J(G?Fg9[AU=[)[g/YZ;AY@b*YM7=9=m_@(24rM1 - W7Q1">%O^<9s[tcUteDNfq#ub9u0n:WE]%T>W'=.D3S84]Nh:dgYK^#L!AE_X5$^dgh"l;Q - +]eTa]s8>>V3'\1pttIYhSQogVq@Z`R!3Hg=eF3h2TD0V8M%6QJK6qhAt3P?/o+Z\m%V]=X - DI%-.Q6="]nf,4^p:X - CLb06eC*VnNB1LGb$?^#ZS4o3rC2EXAi.](f3*1erts#IX'\kR*N*VNk;IGdbT?sB%,Cr('u%Q@,f2O(E&`Yhp5rQ17)b:BU&Xr-).pYusS@jWbcp+r"p#iQH/2HD4ueb!@!UuLM/j)_P8`YW,o>[j!Sj+]`KcYhP6UK_(4BYaBmA:hU:gbClr&cm>-+%2>*iu[J* - q&KNilMASJN[7&aZ&mC^rs(sTb)]jo((@BWtb@)cL7&YeC+TOn5?()@.[p0p[$0W;8beHC%;9?>X654U - ju.L\94heM>iVu+kQ-(p'T;.:\`bhUjnqebCi"Z6ETb&tX"j`jY"`S)JnX;)k<=P\Ao - hXoEG"X"kbF?K#+B6QSnP9DBOtl??1V`aNoj)nh8Yj1L8aaBt[XjCgA7I*62O**@;g - mlqXc,:%9KU7c]MKCGQje[#8Da1?qtom'Z[I/7D-)F$-=;3sJ3rY0h)mK4C0YD+$Ks$+?,M - BBQ$SmBY;H&a8VLJo*;RD>%6MgB&V6/*t_JT*F@k/"u/r);!a*m?XB4CH9fq&>O.+m3^fX` - p%BrT5(--BOr$e53D:qlY4d)D$"ft->)^#M+\'?4\k0Y?I*Jca_cb^*0A3X10SKCr%m"dDC - 3Zs[JT?=Wpf24me4`k0"c'[D!p]l/`tpY'N$Cd$>^4AB7C0U)Z"_L7"&&pqmJ]h\DZFP8(?3@#[FY`RNfhL0+n&*]EK9a2f*-"%#&c,VnXDnQ_\fC - 8/V"&AE]_A2hZ`P*(%;TCm`u2J7h,$r[.5-U1+m'WB/+D\0l[VGnt.DtJnH(k\mHLYad)AW - 2S[:%^="7Qn/",4Y/`EG4t`Hn]gj>*?%)0ik&>56CsNda,]gO%#>([&*ZH(H')1\JIIR+sF - (LSXQO<-@PiDXYFB;-K:JE-J/+Zt[h'p*Uf%.F57WKj6E'C5m5>Lli7I]07p.m:1f0=)DB6ACQOp>+_B1MSe=V\C\*2d$ - 8B3`,WJp$5hTgse17trd3@IB)[nlI76LKBG4/o\EuZ0-K"?VY_f)K39t4'q>SHRH)iX#b>5YB2F:eu(b0G0"in13X7%g)!5!%eK@cJ`X@YoUf"W-R - F%VEd:0cGSb\uO0&+@"SZi/T%A_n7t>fUM#%'ja!TX:baeN:%<':UpkQb4Q]QGFCj#Jnr1h!-]@p]omK?UrE"FD/^3sM]PjDqHG@r%[h!j>^i_TJF%=j\k4F#XFSt< - WrO8_QD1QfTDg]RRqS.B#(5r0fP5]sHr3)[]B;+g%O8^d)r4_NH:V(JL:AfUA1oIC"0@ooq - j`n8FrK]>>VrmspnM>[`)./s@"9&H*!!"-[pad$e$%p*g&6Lb!)$Gga@W - XfGMNPc;>GXP.m(lZA,ZFG9s,9W;n,4g&\atk`>9I=ctN5cMYSODV$q)nLR4-n'd2#9>GUI - C0jjcdeT5&2R=d&XN6>t0lHN`2d>]"E4(?_1?#E[dOHYt^#/C6TU4&sl(\;Ce#Ge^CL"TN< - eOBaqf*LkF,YL2,6#K,2M`0t09*#;_[OgM.VKAnoYTct6up]e4bL0>?;N0KLQ#%C3`cG+3o - OkA@fcDYMlMhOa[9Rnp9[8G/;sUW,t#&mO`upX&$XVd-9h>G&jPnZmOu?RiCR](2g[HW?d` - Ks9f%G"uqU0AO/5YEeRB".;=DFY1b#Bq*#KKX5+YlF - uS..-s&Zkq*.Wjaum*ChPdPH;'36Usl - T+]+"P0[?3Yr,$(;&/.2?SN8UlXsci7M?JL0"k.%u0(G)fF,hC>7%c\EnL\K=U:Em^'a - rqqgeUmTGSE]5X3&hoKdWI\j44]SA)Wke)reTPp<#rQjsQh_WDp]6<_bF<$o3e+J#7(XZrf - =#JCu>Gkubp3\f;_fo:.Hd[,o2gSj6%,qH)DQ?k:fZ0A)0q@QX=4B!@qm89YB0F/=F?`Se?uq%]JgXFjA - Z._IaE(nR5=N,b:A`Q5L\*4sUOEN/1la:T7.6s>*Q_DK7[IiTT;/WUKu1Int9o3N,[N046( - 3N2`9UeAjkneO^+#o=apI#!lHJkd#6$Y6WUblbI&t2QUa - L`ZCKQiY9Z:MG2=!urPW0\.J77p(R-KVV;P4JCYSBWt.&muJ.32ukQ"%YYeqH`\m;c+u7a*$%g3;eT+%J2[`)_Q9>jE[ZYgbSGfr - Go_l0V9Qp"loNHIYqG/O$K6?FO#^JuP`OU94.2(#)@6C?p"&Xqp87=kW=U/O^DXFqV7;HLj - SkNE!'G>&_fW@n!MioVnki\QT036"u=J\ec".dJG\C/q">"a(f9+=G7?ZN(]ZOd+-(Tbkd? - 1eM((PANpKt36])>ITPP3/M!X,W.O*Bf:Y_!Fd# - ?=o4>PEeL:,snNm;:psMgjkb6!&=*.:MRmOk&S.a-g]^A^"S9XNJH%Qp3H2bh.'i;?>#Z]- - `tnR@BJ=E1csKktgEL]/*'1B)&ZdB?WG91Wc3+Me]WZ>k(4%`Ym'YO#*b_\"E0lL - 3=b5eh3bMX]QfFubg>gji1H=McA!StV`7N^HeEEW[Z#jg>eV`YVPDooZT$0BFF%,NA30AeO - T(RQYQTrEHq_mofpI!R@Gi3;X^p#HpZF_±1Zfp<,JLfpb:om;95sp0c)A.mEII3NCZ]X - hraI8h5!DL9Y$nj;`)CES]#]2$r_6HN,C1c"K\YWWqQ)+[5J0C!1OoQ/m6s,P*`ZV"qaef_ - dkcg[9>aH1@caI!];*D2ZfO9t8pQqc.IhA$#03lKF\oS78V>@^a;rlWVK1F)Fe+3i6cS)DA - 13:=%43%kQJco9aB#PJZ_C/23Tp]((?`I:ibMfVdp*u#k:8HY4I_90@s$GR%:8[f>f^crX29nt8md - es`&3/k,o-CIjDlj&d!iu_uk`@,\"=3QB4S%JU4qF1Amo&b="H"J?;NI"7&5)g$Ws"Lib\f - DQCio?3'L/\[no$r$O(AIY^A(.$kqI4`j(csQI+PTD!"anhbjPi+2$Jit2aYIc&#ej@PjK# - 'o+$N_YADD)i7q,t=:gkf:qZYoM#n/p]C#n-/68F*/3E@1$15n:YZf+d0_=X)n?$0hiaOg+ - ]*/[Zq$NZ$XZj=8d*U.O#%FD;%>PF'(cG43c>`R2:gWX/R1dmYq/IbK:JUB*b2_ut%Ib.bc - OBk*Pk<4s'+>YV:\M\eqEV)s$8Eh0`(K@AK`+Tr(/YARKcpR2''ZLAg$U'BE,aU9TaMFX(o - ri(E;%@M2Wg(-^!5:(,:MCSJi?38^Wl+%0Bi@sb5Odgr/&FLC@)I#m%$ek"mO;k@hg$FlMa - FMjM_cS6n&o9lMp,jZ;LcHE0@o;MS(EDZ;<`ndA3bcUEL6C7^.4G"+^SJHEK"GY>Fa)WU1> - `3?nl:+\OB,E[p4SPorsGZ>ef.lFeJN[1Ja*74 - tX3-0diOWp3-<0/3h+\576$dfUgMHRt3%-o3k*N2%Mufe/IW/8H$8Ee*/U+!_2G,c`=PdIB - !_;%_8'.l1Bd;A1W[2Ys`j2:GJ_'7V\LCH%+u0lON?:`C@7k!!R6YA-,#EPg>5R5.-C:GX! - <";*\7fc9Td4+pZd0cMN.kl#(spCN5Wka[&t1s+dLndg>"n(](__Y=XR_9;@57:-]pHQZt; - *c(,Xo@"M8GlEp$(NVPjAc;Eu=f5qqGoB/FNIbSH%hc)ruY]g1k) - *N(#*O4&m/p0PR!5.pM4)^$A%s:#+koLG"78C<\bi9]N,=YRIos?57<.*oiK(m6G6W@hae: - 0`j1uD6:#gGM!1G)!&o0[IS*XugQFIc%R77hGZ//.sXFEoF@b2UpY6:A(FPa'*AVaShh9+W - :)/\t#<[`,W9_!rF.&DC7W9h"O*'oU*F<*FZcIn-lO6a1o3o+^(>!>&4f4"l"/oP0jP^A9\ - *4(\::o@l_l+K&2":ohn\2%`%DeP6i.*(f<\e,NB(aBT*>_,QmloL2Zc4$TcQ+u)>/Xk66d - ^5)jT2/W:S'NIaOnB7t<.'c-]^;Uc/tCeeD.5C$5VV;/FtI&:0j]#0A6(!bo$LsU3F0 - 'NAa$aM[LHe+G@YjbB*G8I<\%k - W*G/?K?hNYnFSB88"!Vo*B"!%;<^1@XKkH\^Blql\[]=3[ZY=U)@-P]T - kf;N2H8lpPtWmN.YhlNN$r<=-/e`Ng+aWGKBoP2dCH/C=/gFGXa-7kHT.a@\&i - nsc$APlHmt/@f=Q9O^O6pYHM=pbGNtD/_0't:Iokf_GI2Z4K6=.rIb1WK\(#6'fm>ZKGSf= - fQjB'="bPA+J%+luGSkT@*0%HNJ_-TJGJohM4b@oDJlkHlGW9e)",4dRJL8cu#j6ln#D@;W - HL'FfpJd=a]uZJJ\3;ki7Pf; - hA,&HMB@OGbou$]8Lo]R(1(ufN<+&\s0^ELc=jLR*U)gfn6d4N-FBDM!L"dViM\HO18DO\@ - 6XL",sb?FkH)A2j9'm_i#A6IJDT?)$YW$Mg`)iIT[8==Ug1SCQ-9dK/k$.p[aQ)NKI>tP?2 - +TR2;$1h1@WdOZ?Knppkb)6]O/sNd49Wpg]V80pJ)?ME'O0QVAKP2-8e,=>@`]n].%rk/\6 - +;RS+BLI1qT<@X)f/VS6=7/(5YP( - )IJMe3'#SZ)93S>b;tl@oNB:?=nPS\=e9Z9SuA-Mofo%5O\D2Q+#[8q0AE1B1S6]K;7[oi1 - ZZ<8]agAJTUHs"q@>,\-_M.sT@Em+n-u#$9:f;H9"*qfQ!I+C7AW%6U5pat3Y>B&m!TcATR - &=eE.t39?(^t.TA"4]e2YPcY7+R)UVm*WdYFVZ1Sf>T2VLm))R62rQ)>'_X.$#c\eV.>2Vh - Q';i]D()IK&'QpFn7*4fRLFR?"`W[D_p^#Kb')YY2YJK+/Y.'a"<[2k]/UHT=)Yd6,H;k]Z - -eN[$3\Q)bPKibI=_B=oUZJ`s->50\q_#+!dZQa%f].bBI8$cDkZs,@1HT\3134<$@-2UEB - gInpNC1)B<\_CDn>?!"T;7G:s\*q5E4%$@>e[J0b[KD'IJ;Z&Ut[_"W1Jj$L\6ag4$[ - bF0ZRsVVrlaZ7L\9hr">I1tHS%F$>[C`3'H`OfkJ[?BN[X7&BS#O#o+hQeO]K=0J>M["Tcb - rG1S+X>(YIn)c6(>N6+pqWQn\+ho^K[t[4-dC(rZljm;*5)oHlp/Z+Z$aN\jMUp4?L - H-Do0,a^`1em>W'9cRCo%PY5CO3gb$A_-,nXe\_C3)*Zj1i4b^q9ES>K+/a]>f5B`k6l - ?S6Ni-&]gJfaNM-,gm,_rVnZJp_7UN$>aN"VK?"p`\@bb_4-@^VD8lE7^YF%V>dG^2=hpQ< - bM8Z%*7r#Sagp3ObIiPGS*7PU0L/n!`16M?*;Rf`ftlJ4b+/"Hgi^rUHd03mb+*CgI+:+pU - XInTaF)mk4E8V/)pE^P`8*;s*Ab^+$dQBOaW2bPr0c%t(p@3CbC)b)4]fZdA&(3@eQff4*1 - sn`NR?PmclE;AI';,WJ(M@Oe=D#M9+RbgV]pFY+C\2n?'P]OmrpTE4L>InCs4n1\!&)OX"%NHccFN*-Cj/$I - l[#;D1n6dTW';(M1VFt3p);A41ZYt0'WmGCYG$(WPcQ';q0V7)rNS)+*(/N`&uUE)O$iI11O>rUrI]<*!HiDWV;S - iu/kARI]9Xf8kj*\CmGS[4c>45P\Q)[IhGP/G`^k^ITRn.!mUM;u;Hih!XI;Q]55ZeSOcl+ - >WD^>nQdE*o3]i-d-=^*W5rWP/;Wl+Q-AoP@QWg[:X8m`iH'WgDRJh&uPG@N696"oXgL]^E - L,5-qUi>u&$at1eFS)jH&]GHQT;X>jcO^a*pZYQM[6M8]7-$EC*c\ - PUqN:RkT7+4&K%>2!S`jB;D2&DggfG0TgE+RY9/$/PTQm3Vb;LGlCMfk+2-n[?f5dOiXRX4 - RoB,G]D"ANiEsjmona(HG748.mN%_o06?]V(]"15s*oPAJ-Zhr#mc/L=b^TP%Mo;(_I='i* - 'Q(oMah+E\3tKd'SOFM;&KL''cr:R,I5D7=uQVG8>O]/N07$QO2U"_q/l%/.@S?>:oV[5Be - #jsV18m=mUIE:9k:M4*6*OoQ-6$M7(jjo'"YiKcT*8Y/j;p&Ec=Zh@q)g9%r-rZT - 4j'P^,h">pHrSm:9[d5=ZNOFGJ1=oM]Q97pK0>HH#[ld@Oo4Ma/:Z`M=Csq!km9+Keh+lj] - VsNj:oH'>D]rK=qI!;$!RluYir9,+Oh`Jrto69U$M[C#nX$d"P!OhB*cK[1/F&Kff9XG"R_ - @K"6"$qcId(cZDPUqs#cjNCQXR)EcVSW>VZjAEaq#;EW2>cVp>E&&@eD`mV>VMn[Q]15g-)8PK$pj[d[MKgMT - B;TgRdE,=2G:_FK(/'j5M/L`ij"&B?S2(U+S:@Vko8_!::Vc^hF4_Xf)pkM/`7U6$;d+\Ig&VW)h$Y:#/3ES9Qgt-GE=q6 - =_i)']FS60_/.3(=Te&SOuYEnp3.f9e7C[O[ - GkQC(,=TB^"qN$\9nOB\,(Ij3S+#>%dh3BratoFH2N%?:#MFTTh]=Xf9&:6()sE'W9s/[a( - FF3bFj(`5tn#>'`F1f+*Zoln[8$fje+Ym-gh$$Y/\o7?$#R]m`FQjj+`.4=lg2bhY*U16%=YA5JQe\cPEl - I5GcVqWo>ea)f">FXVn"CL%I[X.n)nm=kKhLVSXFdOs6ui&flQA$)ih's#Ff]NlM8O3g$M65X&+?h8r!:X(T5"bRN:@O-FUV - //_Z4!3O28UJ]ro;IgGTV!KlO0-\T6J2"2ULHN5O-slWaE3+]`4CYXE_&/-9./+97#=@'LT1)gmfM@7^B2OV - #\c32UZ;DN%)=.MD!Cpfaq%W<2ldc=_.on(ZL-l'e&LgH>%JJ-g>d&@C$-QN/QoNC$&l(Ds - g72qRM7K?%@I2EUI(SOf=ZdQjW5\G]rSl@^2dhYSAcX`;Enm7>M=UcnGeL6qCSjtO"f+q-J - >?g1f0.gkf:?iQANA7/r`p"3Td+)AqnUuqA`&Us3AL([VVM:o3fim]a,ZkEUG1P9W3@gqMX - nCYeeqQ%h/)>NU($:8&)&luM/Tn0qqS:aa%:-#_Ej<&>``Y@q*p`K^Yr6(-=\Bgs/CfQ_[Q - ;];3SS359lmMH0%F,E:Le4@(U\FLd+W86CFuZo[h]V"fR$80/D[S?[SG0'X+>3V[A((:_Ur - +/EEt-'cF;8cg0EBnE:/X_\sI$lgj;n=/nM;tQZCd8HbXiArSjuh:?($?6#s/?ah;l3p>$, - 0HET3s\p%?RhgC7fG - YD+%0G[BlJS'bheQ2JDlK)OQlm>.h2"MVC<(L8R"NH&8F_0D-W7J&?ena8Loa+063/:cJq+ - U^KDq]V-NZ'/2U4iuA.i8gu!P"<;Wb*`2\AXp;nEo(-FR-BtZ0tFOm&4RX\1L*D*1e2P\duQW._5j59T<_UfK9P`6*DpBkEp$O7egiar;jAD&lc`MXJdEq\N.INL,g;-J.$U=*&8M - 8%5di5hu7EP\b3;]/8C4gO$h`mQL.l)ri2]\A,U70%nF<$V><>_6\@jOkr17H>Uq&` - AdMsiEA=!n"(oEF\`G&]H<%!mQJ()[drMW960T/n%X-+qW(n2QYp,]WQ;E\rdoj5L; - qN"qMB[m+ShY5`NWH8'CfY=$_:2bOfb#jEp`=n9r?pU30X&*o@RbVpEffs#8*s+ - $8IFHh.(+pZ),MW>U1=\+`+"aSu47nGdEOqVQr#c'h#u4dg=RX5H2urBA-u44F3n@)>/:lG - +A3-/s3ad8%Jn!'X#$5HF<<,RD%un@jf1ZWWV7mfUAQ)'Itln)XJOV_5sRKr$k;-./G?he%m@4,r?henL)")U+$ci-gF[14>/%%U;2)M]])mQP*3QMAY!'S_[;Jj4?,QQ3C*3\ - ."jZ2bWHmc1W,*'-hJZLA3[r<5f?!U6mOq61c.T5*Ps?c-<(74R>rX]AAW-ZUdRhhPURlb7 - )Jjp'(escOt*D&Q`6-^73jb0$p2CBTgR7=6f]dc;H^tt7REVK7#XI/$re?[;T7?T7)V%'r( - '9c0#`3D-$2&`S(#<'>==?^_b=[AJtGMc=e:9m.I8B@oP;8=Rm%6X.L^,^>]<%Ql8rCc4)h - tsJT*uH/A\o&+l!ro;QrYq-c+;\-F'#2>,]LC*hF@&_$jSgb]#ad&=Y]E7oXfJdW\/+B>hG - A7mo.$jD`+q-q%#dSA]#+UejUX;lQ3L5O'-+T[CcdNL*n1_ZX:7*'Br@AKE[i6hH52eI9X;eL[Rm!Rb,fSS]Xc14`CpE69GG.^<5$$lTutT5V_RDP>`?_YR)e!E9UotD1mZan*9!QGKQ:Hc?6%Z8a)s'AkIZm_tF5\"'Fnb_OI - @]1Wjg`mfmh1&fBbeg^O]^DQW<1rR#?\\e!03pWg."4B2p"g3d:"8:JoZC!`^sDqpb^AcOPm5OHP# - (H_;=)M(XVOSmo2*A8V>S\;<=2=*&lKGX5g2pK6(QBhmmr;#d0`^d*5E7,jZK4XY5L61bpiBuN19KMX66c?Q/69N<.P:=>Z:&rf2 - )e53j#eH8LQ@9,O!ebpF7V(u&IACNDfP-&NND,aQLB - K]p@uA=Y'G5I[ecf&APdo6I@oTj-=*2G^rH - Qr4qpf6Te]iYHojq.rD-05>dT(_I[:[tLa:VPDet$YZ7"e[%=4g5^f,]Cnm>"LPX4N&ebP` - I4?'&,>;:CLWS/$KU?&?M9Ct07haOGANaTIY_5S/oA&X@a?OLSHlJf[2>=u'BP]EKHA<8&2 - H468Se&[#'nJ/*/K)/AT4V4,%!'/5%UV(/=qdE/Q/%l"A<=^?9J,29?&#c;>[gHkQbMZBs/ - a]gp1>8nR9mAuhK]%,?6>9anfFgg$6[')P*gblcM%DH'l"L5YMgA3m9;EiHEgYIjkgK - !(`orq_%bZru:?*1G=?.iN^atQ_6?"Mc\S]4s3ii"0[g[3eNrQn-:0Xmt8]_VUah?Tn-3-0[-^i8!G8?e*-#ec+A - _!+4R`0(npG/a-Fcpg$&J?PV>Q;\.co"(+LFi3L0bV*E4lN_QT&Ugg?&Gp?&:D.-F(5UI0V - ]fZkeiOg%2VsJoFr#i]W='p%H=[e&'jg7=5""L/P&HmI4E\re'$"=nCRbe>ZNJu-=.,jS>: - EgBY4t,'/I:?M4e")!J"t[bh.70_piq3%4_6dZ*fOENf$r/V(r\Tj?-jcJ'W'2qF4tkPg=X - F=Tfk^C2ei[GR/&k%9A+_nB9=X"g-0'tF@\uNQeQ-/!3am2"ioWU5*Znkr5%4tij8:r55tg - $o9k2lQAJRC=rL)aVbM,3Y=S=i:mS)-Mo=T`-eO)V$S#tg.aM7Ln)<;>Fd$ - fA'2.:ejidb.AopKA]A-h'eLdr/m"`QCmN*%N@X&s=\'PBj!ThTem-] - >NlsB=$ob#U4_Jl[(@brL$53)*-!V#g[DjM,'7@`\MTOsL.k,,FBIZWk/M7WtT[YD"B$dl] - FoO4:TBRZg7^E)WHDX/pW\lU.lm^23`-0C5oC"A1+k,\%T3V$4Un\6Vq[j/;!0'ZAjEc,`. - m]:GhX_-0:lOL+1h^EPq.<9ViC2Z0):H)njRH^l\o,fr3ml<1J122M,Ep#].B.S+:4S0FWn - u!r/1H+O-0ka'4lCUQ;T.oKD5P(d2oZ'8i6RhYg1j$2focG1EcUp5g:?^k>ZR8?:hb*394e#dg!)>_g:$=,TakA$AVu[p,-YKhmTMg?p0;B:B4@`tVp4n5_AOJ:*u, - 't#^5-h,aMC+)prJFa!e2GF*> - ]el6hmH2!AJp[XMl(P,'Fg\[8Q\G44Nqko'$3u7FU9FB*P^0HjfnJM]_CGARQM@YXGn4kC+>oqU_bA-aJ#aP']-KG>ER1%O - cXiRX3;Eq8eJ?K7`l:T6ggG@V:i"s0MU#G^3A\q7i/A&%D>3Hi+,_Hl&Q):N1U2_u(V!pl8 - =$Dmt*iZ$_VElkboa\#K8u*rF6sqe+:R+0kWKb'MsrqK?0C/$8_n`HuO!r0;4![uUCDZMG% - XI?26jn'-.PeU@2=GfI3a0"Bt1H,5R(D(TMjKfAB(G's.kHf)=0^q"p/P>2YUqp0RNq+c3m - 3SI?5@C<"XghQOK'0Q)$AC&&7C!bQuiaM:h%OZ^am-T0"[ICHKJ!baNhr"J;%LWDl6=CG84 - ;JA7Kg;@%."k.m#`1g?OQ^dM)[_YE,Z2W.L,B[+`aEhcba)*OOA'2(R.SO..%3ciOf3):?Q - l(9W&%PGl=2<(b9bWZK[-,;P0d^G\igss4d4>EpD775do:.u)08$Uh?u]-E*VYJ"g$!G.$pAfm - #NOY94+;jpX1Pr`q-3b<[hH?`pU(qn-=]3Lk2a07SbKCmVVD8O0?Z - qnUEq)q9,;ZEccHbT,'YH!]T^sD'io;U$Z+P&hTS/2OI.'a+j%*GkVkb=2+nr0=3Z]bJ[n, - s<47^2bi*QKkG0"/B3XD#em8,QjerC!EZ7;9;c:9s"Aj'UI5J#R6t8;X/sT'"bL5bq6oO\= - M*9?e4G`X[8ehESeZX)9kg^6's&IM]1ucbEF&^M>?)Meg\I4]tIiFrdVm\J/&+E - _NoHk:b9:smkJog;05jXGc>Z+[\*f3 - ".*sDlT++:6L(XaI8Eg%2&d? - %RaO&07l#go?ca%/h6$/=(@/^(H/AG3f-mfp*q=UG)oKbF%j>@gpVI:bm0LZaFlCr\gKj.; - 8nfSf>#VD>B;khbXE.@teP]iQDN0e]A9eiNQ`11q,et[O.L#cJD"eDJ*22^$F^(k=a+u^#rI[HTW@iH> - /W:R^aGdidYiCY,[9F[N0/[FO)[D[-,6S+.MSHNl_;eEu+mVF:2lG;<#@m;X#-`ohjqP=>O - $+M-a>CJkZ[>-V,<`+VHJ*E/ff;!YYa0HdZX>;7aGQhVt-U\pKLKKL>GF%\'fcLTCP%3]M` - g(c(i?cI)Eh#(mF$Hffh'?(4'G1Ar6*nq#)CWBh;-nCf&]K$O>^5WFG[fit.r&R"&2L!3^@ - ;[\3IGot&i)#<'?]Q^Re%3?el"_6%uJPX]?W-ICs%AYh*-Io[\f4a"QX*RPPM'P[%&s'g&5OE.@$b/kkYP+7Mm&DfglLta(`PRW!-M;(Qm(qo%$-;Y8&>Kcg0fA^V[E< - _!U_7%MXV@m6l&XhT9a,(,\oM1WL1)\(Gmhk)QP`"nGCIX_re)>p,F3h8M`AK"X=p/u$eXhbh/j&7F$=Z[rPn1SUcj!iBV3M1KY%BjXaB'JCgq0(.`eVT - I.m7R8XJ2cd1V)bR$`2n:S'R*C_FV(*>!2S98 - /PmV7`DLB.6LoVmI)!_)Vaa-`%`WTld9UUDmK)D0rt)2U9rZ>@hZRV72a>B\Lg+-R%Fp$!B - s!hRggefP>Ve2V/[8>PQYkl(mF?1Er_I9(aIllf,I7(2)G"P@RAsgOli*p!=SG8Y&6K]S3B - !T6khQksP53eRH,.98ti1A`'\XL#]TT>gaJ\jJeBXj0MDOH]e9dNb]MT;G6;+Y8->Vn,!3d - V[%gSACA<&$L$'2,?jA#nYgY^Y[N?f^9HBBXUa4l?Pt#CWs/Sj(n%GR(=Po17JpURUGWG%ub^5WH]Y;:n?T9ri7@`l0.o2O^-"Vs8+-1e)T!pd1;/4LN1#7 - T2g$5BT<>T9&AY(#20LcCa=!qhuY]))H.^D'/Blt!ee!bQs,A04#d<`,I)Q^+-,Y&0'(&N& - sdI`P1#Xc"+.]IG-6=2:"@M[ONONccp7HA5]8V/h8g - @ag9BFqB&V@Cm.)Ctei'ngqDY3sA*mXk\CuTu^:S@qtIUB=K\9(-"AFNKQ/[\IR3fW*(c`D - KJF:G8@L:)c(e/l9Vc'IN?ftQE+ul\%$A6#iF%1Ds[s7]/T06>.arK*c7n!TJn/KG/&>L*Z - )jB(CoT4m5&Ya[D=i;1-aM`RI,GbLj)/ah,b\jm;@NKH03Nhf7T3(DI@ebcO&agK9Yg&gJe - ]e50#fdbAoIUemR42LKYX`^RG*B/:Y5IS?=S21+E.XZO=6,8[c19_8`H`P - Kj5_._9[g>kqr_;DlXPopNq[UAm`Fqr2oP%ML"\R2HKQ4@[s51bj&%t-P0-NnCDq[MrIq5W - qP>398R&.B7AJDibp'2GQg`Oq9_]\;i;>fuqiSq;pqJKAI,C:\A][,'59K'9_GBh'K8F/(= - 71K4TCBRUhtu;8l[=i1p:iQHqkj,[rm/r`5@?r;//C!:TFV:]gW8#6/WO!\acT,ZarL#m*pF!Dflq:b$)h$NY3'rQl2Zn3I'd#m-+6"V< - m$E&d)9-NXiOqlh"B:WiqR#`sH?n;@T,=UD; - o#LI`#0S9ZBm/E*$qp8sT:brGtSHH)r$LiNQn@8\kXTm.Y#8#8jOI6L'dfhGW$4tAe&Dmi! - 1C^SQ$BW(60Z+ASlNrZ>#uL9qOKf7VM%.i;$tNDe_kb`h3mgYgE_Aa,:NY*ICdcTeb:d=h& - Lc3!i=GGl'G#a'O\$6a9b]'2^$[&M3X2!r%OfPt)V@&MTLW?Q[I5f4@eM%_V9]k9*E8i[\cODT^_ - Vk0:`-u0?q$Mo3F.-XYH!COV/`l'*U%JKI@L&1X`0X1C5jX:Glfo2j8# - 9dZH-PV)AuP[gIgAZW/o)P;TZm,I;kPaA"9#HT?.S16*;1P49_PD'm_O/Ik?3;kZ16R5d"Q - .Pl91%4ju2eFh34'$kUZ=5-@T'Z4nFObZse>I3WF_6cd?9F'-\gF"O`,X/rP);Pur6d_lQ[@>p16C2 - D3)!2ZdE7dUQ/.@0R@,c'FV7VF'1 - ]m@_iBWV'E0LL\;)o])%RsCnL_9;aiccJtO^-"-\lF#O/'?3qaGpl@;G+]*jb6-'Nm:X9:N - Ui:b]pZ2[m)F5?IU9%0gAM-.p$gI7S\WLbHek1%818SM%u:Ue<)4.d-]=s6I_N@bp6OBq+d - _NX@aabeOmjP=MRrqS]+K>l`X%0LAr%g$/5JTTo3R[JO9unP24nM - P=^>i$9u<(`atTi]'joNWRFR:)Fcft;ohcH1f%-Hcoq>2S[q7+?;iE59Pl"o'92h(,Je]M! - Ej\Q<=&!JB8eunn'd$lL\:mU3`YO)>Q?cs#]4A=59,;9E@?%(7ObHIN0of$'Pk-WD - Wh0nU]4()@83$?:_o%)Ws`]S@r-'>LD8MZjg8S@9jHe+9h^5%YIi`")@PYBN=nrN=SS2"X-F@Q'-jQMGY^Y+6t.AJQ;(p/WVXMg;:]9BuIdMQM2ACsKIfIZ1" - petV/*__\8&+nWg*%t^Q7+b5f$CDQe/V!!;&l!mg6Y4s'?ZoM93?SU0EH>0.';Ac]a9mN"E - AC`&@$rJNW(9ps5d>QV(L4alqgO=rtM"fLq=:]:/B6nC%DR0.PWq/+cC=LCA?]8gRfRShq# - )lTHB,C(02+GfU07qa1JXC@S`h.hu?$-qtYO8/Ef@an1FbR?%KfELuZN#S,MW7>8Lpu6KQR - M'aT8g:CIMfDNF^J&S%`gI^!!t0;:K075;371Odj\?=nLE(uB3S),^Pc$7=(slro!P_K=iU - e`oupL)4b@TZKt-f$'d%^'nVNY7LR1E338D(S+,?o;HtsM!/PkmYN6=fb'?mhFUp@E7spP,&jPk;)3fIqoE - +b'-?=Er"p8m[KkD3`Z.C"^%Q\YGYifWgd&3Xd$Q']Y$Dr3Ei0Vb?C4g%1^M2i/`6FI2lH*#YacC_kZ$ - .C]2XQO8?_eQZO#_\3m0/,&S=S7YR["dI3`gtQFe;iGEV8:^H3'!u,EDOJPZi:%G;"a)AX, - 0?Fgo4:(LSe)RdFTS\-8%VDZ!V_*a3?$K-Wgc;h4I;)&#"F0dm[2<#JqEl\,hh11W>?c1(: - a:?LrYY@ge8\EkRPIP\?qj#V)M>6M"L#&"HN[GZ4B=/)cs>JLTg7t['';6]2543#I1$u9 - M[sa%)o_\=Q0#SZ#8mDhD)aV+u:r$:8\]W(egIK#38%r+sJ-3F!:&e`#guLNh]FR21)7- - VHO1fjF^kNiu]HajI-c%+h\\'WXHh4m[(U3L@_tiZ\e'l6\U,jeYa2JXQ2hP`p5=O'/IBi' - CETWlne4J8&e[]kl+VKr)jaV.#kj/Xub"$@6^\3*8FEq_H_M]k/29N/\f1P`^!HSlJ3 - 02`OrP'&i"9g-/%9eQf8'@/NU)44X_b.QK('^rj729UBl_Y[EF3s!P]hoVAUkZmZ'>i!PDb - H>*r/j.8&>bTJ,!RH0)3aB5?*>ctK-UHOadK?Vq'A^gcGh5'cdCfjj*8aoJ5L[0;hAilLSM - /*4>LQJ+c(,*erC^P3&^%Gfai!e\h$;CK7Fi7ac96U-*4rePn'kWuesjk54XJK=5JOm7g"i - .D?#+;io/]%!31WFe]r0UJ/#[`;e_KK4]sl^#YJhNs?h<1!<_q7o/_o.]ebn=XOuXNd]+qN - u#Z0[od+&5Hra!U`NifU"uSoa#@CZc7Bq;)Vo5 - 'c?Gjkh*_idQRld:MOH%I!=bkT6?-*`qTtO6D$Mkrqc'^7c9*VcZpS*qDXlCR2+T$-TZOmg$Uj^/6'^=D_%j7+ - 1Mk0U*erTku/!NWWNp%]G.S991')-bHn/=!iYCI,%E_ljaO8%0k0I$*AP>1LkhQb#N,kCiS - 3\#G/3Ok%'J-]2d%k`e\QpGE[f=WdBXgO?Mbp]#+*g9(.BKp$q2K3?ZGGB4fiRuVb=*\f$X - s)EH,DIMFo7(RtJ[*eTPm=';jCcU&C9^&.g - ;3XA[;\:[TOW88S$:q4?b>HS^42F\ht+g1S<$+PN^gTNsh](BN&)VY.7Mdf;UWBPn$AgR+( - BoH0krG(U;[@G&!";kq85rXqrUB6M#)a==lA1<)WB`X\^]1r#G8BGck*3e4T,.nR8D$VO,N - W7[KCYfPq_>--&$1^fp=%N/hO@PH!S!)>lAX$\Y(r/TY.1So(OUC:@-4j\m1pZf^_g%/-HA - XI?I(e,AY-D:7_ApUrc"CU)LWD7cA'7"V$LL\X%1T0KO&iq7YGEK9Lch79N+IhZaK$hLpk5 - Ko95ni[MR$MqIj'E\J%O@0BW^sHT8pcG^%)[/P>_n?)fn=1.&683dRn@k!c,ne-N"1J"m:u - jPL6STh=&4H%.@2h<@>[nO:n[qd-7T''K)TD7mLD<^Ib[Z(sAf8eMO1c4/Qd52S"5g)"/&Pl,#V#`)G<5b1n<#&t?.aZU\ - 2ce>5]kL$g<1S5'eoSfU;V&7p@o:k)';4mK9MuYi!#C!IaH-_?\@]INdfF5=[_qKJX6B[HX - #JVK_em/fICjLPW%Fuh+Vp6aEOJIIGAge]D6h]slFkSn?d/slh`FJ(6%D2#4)3Zh9==5@hb - BR_dU4Qu++)s+*[IiHf]+]?\BSdRcf;MF1PrD^2?/prQmO0@29Y\6Q/XfI1u%):?3,di=aK - B4B/kM+RcO:YAYV5pqa0>MYJ,RGkY=J?P\1muK($!)(+H9LH)@=A[(/r@Ug[HMB;]:/m_=2 - 7R>sh63kE=Ii9f3hTs\OBmb>)-\HT;Gu]^e/a)pmbQLHCUer-%n4Dn*h^`,Jjs]or&Z5-99Wh2aAFna6VAbV#H(= - kGaiZQ7i0*D1rrGkZicC"f_6CQi7W7gm`;qAoBcGH!aXK3d)T#C*^Z8'cqQs"M^,Ys&>bpK - Be%)e]0-GF*s]s(ZEI5:?C,i"Q/FM`ctaB7><%quqUi/cNQL!rsFl3Id,'#J`:g!$J?^IjF - ^j39VLi?i1mr:XnVnpa3nOX!8&jeQp$VnV^L/93-6KhP[iX@)b0Idu - *W/1]:N&lZ2p)1MAnIo>Y&;Lfd,+L'T&n7@kMfA)&6eJ^V,#hNs:hD5bfR4CjN+@jN0TJU. - ;[aii(lWHT1WL>l'r.jGN3Jm,`-B`Ej)e:]EU!j$'C?R2,^YDGJiGY:6R*f9ObN>b7)s!8+ - _*?(L[g*d79FIK+H0*ZdCq>(fg?[Q]UX_^IQko2:Ce]RSre!,7E2:t*+W$WM3>kC`eAp9#78=GWWu)N>fT'GmZ>eQQ/1t9p&7YSA#C=?If%d'kBB - p0l<`E)<3mlKh`9M,\W3l8u_Gcq.;Jg - hlWbf,sdot@*CqY:pFj6=WC7&Gs"e<(L]Yg'!T>gJ.V1OH+;uF;o7=DcB - ,6p5u'6ET@RAWgUL79_/GcQi>_/K4a;I"0@e@9a@f - &:F:DX^s$E",P61E2$\W4!m)G[CU'],+$J:.6Hh0"t^eLLY>?K=MjHr)=XXJ`ucpZaKNH)- - jS,n^\VR\R=N.XCkM;2$0uV`Hn!n1Lt;S*6Em*&*C?VOYWL>`L-)>k1kBIZE@$G=T^h=N4F - VHBg^16KlH0:j\p0e,:L)a0'GrJQnq3NaU[n>@grO(EX#=M2R?+f/NI4qK:L&0+"c4ECS14 - L*QjfE1-(<=dpt/Z^oGnhTHK_=C - ^O%I%kFJ`>>IIjO=5LqnP$>D!`W'fNCB6g!-`%gVJDOBQ60q;lU,+gGg:Mi'QbAlg2LWrqp - `!jVID`hNXuFq"o2oNTkH*NP[F,4qraPS(W-#2;de]6-E#jRnp4_JURN%"MXD,U0cN`<4Mh - 5CY>KQPf.GU=]ODR`uZuP7Wj&Q*-ESRYhns;,b)688Y^1Yc;io%`k';=q[*I'I8`P=F98*l - dnGdq)/hjil)lRng)[8*d=Gl(cVqRb4$0)O]khUUli1VJ*19[=`_ZfiuXUi'4scFj$Bp9)6 - VqX8=6RMR13mK?9=J0p**8f`?V-9( - `P&r22f1]%S[WH;=hW[Hqi!KK+.@^f:q_P'mmS0V - o^:6c$T$$l]:"^]XI")Yq+bpc:41^I(gZPRB^f2E6oh](?rWS+O@`*Pmq<5h"f - 1A'M.IPbC<#WBDYI28X5ccKOA/;V<,XGZF5`sp=93OUfEC)DB_5!sFZg0r:,!>bd - 0f.C;PLl_cl4*XE5pP,*9?kB&q)t\K^%-ZKWk\la'I@126kP(YH60cCr4l8j.h!o=TrU/C1 - (^K[0'ih[9J=4M#=!Sm_g>M&'LoYZ8&Eb03;cIeoD#i$'0*hd6?:2YUeAQe'gAEN5EiTGHh - t:s:r"&H4EO<1/6p,`?)cmk_djcV.q-0Pk!b4e`(UQX4/##0?q":m`b\pHKO-Z<)9#9R6DP - aA$kL5qAN3?15?oX*r('"B?T\U5nu3I8b?1IdmQ50Rt5>Tk2".7C7Y3n)Knlu0pL - O[uQ3[,dFKd7+f.%[BU\&.G$C=ZI4*;EWnM'TAQJ&R3AF"-n8,Q9:cRYsO`bU.NI1Q8)F$R - 9U@eUWORPPq8q-A?/=EUD?7k9$'_k;*@OV:QkpXb7(8`5rk2eU.Zq+'L\l7Pc79nS')r`b2 - g')e=fO*[EC\9ae>#+AQ%;%k`5Kk^^.MAB95Mcd"OP@4futmQ9r-Fb1qLp$3)+*obOjF[@6mN - hhFn'qbtQ@+4O?fMgeGH%:3=lUN6KD.k0=+TcA<^eXIdQ#h%b%^O*Lt&XOGK57S^&CcQr*X - 9_;+co?V7G:NZ;+I/-QsqG2eA:Rq=.XSblLrD2eXci!c="TM:-!`0m>:_a+0/HjE`"]0%?: - jiMoN<`:F#Z.'":ot.&V%$87%FE?0;#L1-LpTOd;C*ejodqNX/CObT;8Q;]9dP.;lr% - .]cg>!-DjL$<#n2$b$3?&2C3c*;O&6O'hKaS3`KBMe86AW4\/O`6dm>9eG;nh`A?$R+4C*\ - eEV2*'gL408^^U2e9+^?D-0e<3RpPdrPq^c`- - <(.VujsBRsBTO?jR/7)Xnn)kB2.KX^>o2N+]Z9nbupN`[O57Po!c$nPO$Ft&]?8PF!6Zt* - `@GQN(K"SgdS3``*Za8P?NAH6>HVL.s'?iN)=G9_qiYVm1W?DFM7Qq%/&)Qo;Gq[g=oVi>@ - kEM$^fXaQs+pYaSho:b`"8F[CAZ[2[.9)JKtpktnm!4,>M\:,Fm*1:c:8o/=EWq3j:]8 - `Jk(ghg-)[reV^sqBAW%N?iBWR25OL,p9i`Z>4n.fQ1\NiH!['4hQ2apN)F#S$:/h85c(hn - gel%F%U0tMh4.d/`TGq;&)6cLi9OaeCTCaCc:9sUiGHNd[KtgIr&nP+#o\3C5_IZf4'-RL_ - n2U>>Gjj5dCnqq`!^`J=KRn;M'$%Q=7uO1ec*R"p0b7m__)[pXl/--#2_l90/a`j7!)p#LZ - !mL@qI=FeYjLRjkkMG@:fZ!b<0/XAAAZGgcaG#%B;!2*941:A,?>d`UMj8/&K!fA$fD!IFm - CX',J"j?DG9q%Kp9pLLdPUW,o4sMLNGW`\eB2IhoWeOu@,8\7@VnOZ`egrHC[LOQ/=;DR[jk;>QD - -tkC4t^!c@t\R$niH;D;-:I)VL1ouP^N.]d/nSSTJ@FC0Zb> - t_Nh'jLDVt.iW,Scu?5mE-Qoq5WgfB%cNTtt3i6)H\-B;mH_ndtG.5f:WpoIr" - fEmsi(J;e3X?`+N9<,jem6$K6WHkdqODQ;l#]k,tT%Q&?H3u`Nh*rQ!b&(]R]P;3!*8WAaN - MramC?G6#X'X^P[_CiIC0T8WlF`9#%cWC!N8))(Tha!Q?=b>#lta>4@'8^ep?^flmA!/3lY - R>Rk2"+M\SD]EfA6OB-;/5C95bm3BW>]_T'tqcpRY^gC:<^$-LYa[p2;khD@Tc`QKI;cnn. - mef?X/oJu$l_[>_QNW(QM>AcQuA]eE3>8iLCkGK%744%E:2t0qd49 - ]qX>RCB"o1%L83Oqp#D)PY.ksEf*#u@"`P7`[D*9E/V=ugbJ"G0]o5"UMr1LcgG`nAd>l^9 - :Ffm,GiF,im-`isY-HXIOW>/t-CUX+]m_/bEE8?@-'FL6;0sX)7ae\W6n^Nm(367B6WE_[, - ]XBRD`M\5DV!o,o>8=c)/"$MEmt%QoO.Rg<*8b\6WHoAFAG&$dW!c#E7*rroG:3mRR'sj5? - 8t8oYd/?&pJHZ?R<_bFU)#?-V@=h3i=_aFHQ4fD`9"8_'4/:$bnr*hbs&q;t[n%n:+)P[8k - .(@s(RDF(\o_#A!M:8G57AorgkdT4W8MB67KoIr,?h>^5p/b0<5mC\JWWG(4r1(Mn6OJ+o*=O8<_f[ot.4I/"4u - (]T3`pJ5p]7J2^mp5b'-B8W#\>^4;GYal1s-m#l8:!Lnop9`rJaMjF0F9'MEfu'hh^ZOE;f]n_$nj4/_# - J80o6N0[UjA-n$q%t&YUl[O@TN;4pAE<6$"p^+H\WL&[j?BtLjQT'gib"82XGe2^7CV$k]I - Y)&&$strJjIlH[it]$C#o[`c0dDn`c*M8r%ap1L-3.l`\:tg6MPTfrq:q[%G87'ANH$j'NV - K]8=f0k#Nn&eGT'kSlYB/-eZ?Y^Z[7orQ!RgYLED-qYg,3Hl(T;(4^eI$@Xq]\JND.,s3YI:q#X?b(NuaO+)?$[tQJGL1_m^g-?V)b7bKW7_,7[V0k3Nhkc/"Q[l3S:@'t&u;*jh - tp*@'2FAuL]dV["+ibQ!!jhk$O_\TTb+/=7NE.s66OW'Hk%qLN^`!UB`rTH+-&dannB(]8L - 0G@jYA9<\m[1Wal?;Zm)jH.Sk3PbM8[D66_R@iFBPFaD_.F)B_;*0-=oH>:T2e.`EI+[O&Y - AOb(Xl40<.uaoX`;%X';c0X7iSgP2C;V:g'6HGA;*QlIE]&VdpTD0NS - Z1CK>fA+$k>SVJ4t]&Ia5X$1_&F3NZdR;<&%97EOG2;0"(Y?S$VB/:JI#$2t6gZS,Gqf_:, - \_ch[qb?dBNC:a+3-mbogBGg^dIqsjDa,V=l#/T:NeVnmFQ3'NrVi]fbLN>+3nf'rT7bhgH - +Nc6s.d!$Yqlg1g,A`,C^[cL2UBj4og'+(6M7A*,N.OT8>7f%6>.h_LdLUJ*t'5ES"fbo0# - Pd7^MjSQi'Ga)'bWs?@q,SR0H_10gLta&6\fTZU$ZW?F/4,bH_L1>H"bbVF7rn]akjP;1-3PhS%-;k+^^8?t?X)Tm#XkfQS - XPd&G-1](`I8CS(8(UnB9'1'n3`2u2IE\qK"au"Ke0N&Ob%80>n`'H^Z1AjF5c89(n<)Z`/ - 3C-Q.>`cZaaZX6t6_FP[>R]042F'X.EbSaU0\ek5fN'aT%+t7T2%u?a21f7][J>[=q#3::hDchGO5r:o/!/d&XuD,:fe+ - S(AU!Q\G36?$A"MVh"t?)(q=])AAN6i0T]"KA]81*f2?T7Z3X/$=C0H&eUL76--'rDY?@Sn - i>0ZrDle-0@G3^"5SRh&U7[]e3=batkC-+&_WbgA.bI-Au7^o133jtBcmb=oE]P\ZPKt$Rk - -+/Qu>[I6+E85pRDK/mI/$n7Tp.r-74+A3l?'rqmeF]7a4,S+WcIp:Zh.E_1oc4)_C2!Mlo - tg=ShdP&L]XM+Tn%K7Ah/GO?);8mi`p:N`SZbi#H5W?!iq]&J8aGQRQ_!#[^..SED;:aVl( - pTn3>HJLR*K+,Zfd)t_7[VZAJX"L/nU5r - L9l]>'&q'h6]g"G6(",8=$m!rmpY=r\4254_^Ai3^,JAZFWVisrb=%a+30-_$tBX_O0Td1` - OPoY+LF*P0ra-La-@!8HoI%*&kp@1!u.3J&s0Bd(q.ts'OdeCI^1^U8dKVY,)hAAKNZRBGs - *=He6Jf;CgE_&'dOY, - SbNf^F#3mF"3r?*)fS!(bq9R0hoQQ)*Go3,m$)8df`N-UF>k$lLoeqGC0*L+soKM?0-/a+a - DO&NbUcPcHZBB)Nf<'FF.=IhkAAA4#oieU>'^D<_PPFf-j<(0p..]F^'@FU$]anc/QLofs+ - PbOO:>$3+RD"FFoig@`C"LqsCoU/TXDNK!V9F/QI6?)bb;CG=1.RaZ'P6re_#X:K:Q!JdAL - $?T;"^#>7Zt7Nt*6$"0!1U@:I-WMS;$F3F+?VoFlUmngqX1o[A'q$V^9oO"oX*F9qI?r$0! - lLH[;5(sYNYh*=>kq:SAfBM((kX^9'3CZXJ15#%B.N2V.f)!jKc`7bUkenZ.>22Oq=FdauY - /[/Z"H&FP>_O9(1]kYJ9:HA - CI+YZ)%dD`+*HC'7kD&<^c-D5qB3ess0/]K:\),80CG0!1*La\Yc3)`mgNW'c - \UY@e7Fnn58hWll]lO(rfc$%(YZ:8!pX1\PbQ!:c%G\<-9*3ri/U8qEm^72Sf&*FqoW\QW^ - t7_WiQI*cod - p^"U((%WPu+.D"`dU8JNdQZ@u&a'A`an_qWf+EbKtF1e]8o(TWG5[cJFT.9$nK\29Iol#+B - 'pgqN@YIDsU>Gt[Hi_quKVd-t@Q>mhHP1Bj2[`Zj5,D"DCQ`LsrS7cZm,gJMR9K$>3;pZ;e - J3]%R8e$<%BA>jXHEn)blo*X#\l49oac8MHI?/b#7AY^`EjLa,%;sTj,)l.oEf!P$ElO8Of - opm(s>1tJXN1lm,,^,##MR_kUVf]?m^!h7.CtFZT:p^G.f@oggk5-I4G;e(/%9h];%*tlK* - m`2[mXOOC_^"oY^:.>,D-q'm^F)^+]A*?I:'X@=G&;5pPnR519a-b2hR'^pQI"o`j2U[cnD - a:>U/`5OW%Z1"h"93SE\:K\1e0!UqJ1$6?3Rkfh$_i(+$IMjGJuSFcK"hoS+%H=W+ImhSpE - &__[_I;ph*(BfG>5k]7 - );]W$2='$?>EJ0Y<.GZ^LlUB=+k=[-g`=KT^;Q,_#,h*j - nSPFgE-Z`=?T[0GPus\.:XNsk'AEC[mID\j9'^ZORWFJun2h,P_cq2GIQssc]e - =Kph7'n?YKtlZn%SJ^i/3G'hJ_cZ:;5ZTg>upGiU,:G:TF+!Y.?:]['*6VXcVaB8q$fsF06GucC;!GEh=+VGceepW9'Qn - k"74J?%[dPTHKY]pqlg^AE$X-ib64j)QS=g-DL.V0DV:+rY7,1Km+D:iY6L"fg/$#q%rCpb - ;ZcF]0l6Rk&;9F(kkblb$Ll@CcD:URR/sMQ!Uuu:%'YkSqTF^J_/P4RmhkPQ`g:MgB$&>u8 - 1O*\=Rp:fX:N&YE@DO&*t$>B"-Bg\cG\ja,c&Q0'5Qb4$oHn(Y0`7[M,"]tnF2o$*0CAcX" - 4,ED2T*F31R,snIK71s.N?nj,CBq*(!0?V[%Bu,eD&'5K - q"M(cCWl2M-P_$!R4([[t9%J:I`;&8TfXmP]TDrB18gC,]tq,+BQOjMkQE>u/G#Jsa%YPSY - [Eu?^s)/Bm,mEm"-5+BlT"&DbZnRDuEE:tdm"Hc\$&?*5S#%)@Y'liCPOFJ0gdas9?*cXmq - Xr@,`e3n - #`9#Yi-^%18^2^diqd=;;2,7>2;r8r3Cihcnck:HQ]Vkp939uEST^'oc_`+),Ap90q/i6*> - O`/,8(jT$;E*A#nP"1&-Mq#nJ[gqVX^hmUG!?*0+BIR"J@6WoPZ.ZL\ig4*j![#mUiXT0,d5Z9Bp0QSK-rBr23E;GF-/D\SMj;$>dC1ScT)L+brF+# - 3mqLu;DC7Rh!4Ih+&^93m1UD$dlB+_"]>X,dk;._!0Iu1Wq`Kl - TA'`!\CG$nS4b<5c+)42q-qU'<=DseG<+%%W1QK;cK=5>4o6,cOr/a;tE%eh#10l)Y2uTnf - 4h!8KEqg6W8+[Zi*3a6Ti>;.T>\^%sJJ(2_-X\-hGGD<'rj1;*^>s6SnBuduQuIY0li,8Fe - 2m;TVJ6O$^3h*`7O3j8R9.p@8enWild!C:md@'YN]!9bS+4b!bl5?rZ469LP1=kTj#:5#]E - p:?=!$,I1=F*`0fg9[r`2.j.:".TAc/<](CaeG;GkG!D6)23dH,V,^@"!E'XS;FH%,K\o^N - 'KDoZ;C&eNKX+=:iDRW<;C(m2[22fm+&UPW!oc&K_no[Y?.!_=`qM,[8g3aNEPp\-W - S8mV-dIb@o.FQ8`=)2.RIaA2ZY_<_Hth:LnWIACaal(0>(u>@nXRAl`8NG%5- - MDe@RAB!unr(3sOnHY=1EBNBOpQ@ikZLM57E0.;ZN')Q)qT1nbs@9*s%E@FV*,k5uDVm_^` - 2!7[llWs2>:5$Gi2.^:*l!-VpP7H(eY@+"l#2mK;HG)=e[AG#_ep8:<0oC;Q/Qa!j)?7)Eg>a-f/QWo6Z - TT&>r?tK[E!9R5?AWHDtcP>- - _;i)8^Cq:)t_XU8]V4a`*B(m"?,1LU]P%bc^qb(Y>$]pmhP&3gSDb:InGE6T(oLTtmE;V;G - 8^ESkOtV?i-T(J'+S2FYe5%F$&M&)fIInsWdCD0]PnA$O!7Xq8CS;pAQ%F5?L3-ih[$H45_ - a;uh#]s3.1#gs;P=jJ#2`%Fd?*$psRa]Q&P@I?#Q9@XEtM%!Ffdg@!B(pP@Bua%r2abCKJgP=ecVW - .hXQi/'>hjdbgBMl]pZ5,Ou4+(qeXjr0cu8#WW3T1t+[0:G]KKI/)B\fQECF3L6)\O;YTh\ - G7iRf0Q]*(pZ![0_q9<@$OB,]bH0mn%hE;M^_G^qUuC9);Q#;J"_it)u./V;e[QR99n1hV0 - UNSL#7i2I"Y@TTQ8F;1iF$EMk+!j3VgLbnopff/"j"-J9kRhQtqX`3qPC[Lq3DGo0!s@Fek - !%VHDBApY`-!$':;^TIrkA=]XQBiL`,RW-X;q08B)PCE,=%)"=B"9cXmn8"K6341$`'-XS6 - ``sboH5h]X0%qUo&]dXRWVXoECg5V6J".QXGS,'6NR:3,,,oX8g/$@ot:pI6.B;@;*XkNM8 - 3/+XjkFE*rIo6`@\p'0\H[]+GC)V_=DR(EGMSaS\RTHs0q3-0I1OHG=Rb3,a/gSQfLp(K09)!Q_C4!H7RZ<7d@GTRjVL=e7nT\H(Z=nepu@# - g]52f$[4OO]Os6\4")p6rf9qhF,$Rg>IPKo1pCd-@5:UUWD?UXFRtCjD_$caotm^=6X7E4r - LPE?(EQZh1N9kb#Y9Fdt(bZCAnK(iLl#kC=G`$"d8S]:G,>]&4IMGPHBt3b=q1j[dn-]eDU - ]qkj^=$aX^/]X(8Kg7al*(IhT-/G\8!HHO6gB*CCrX,^[6&YhTR&$MG^_,D`!&ORd)QSal- - a'6M)q.I;Xs$0]j+:K\\o@q<3eZgm#0XAC83e,>#$*_&ObPMl+HfLj1oq'p?`;JLXr.b0>U - U6I`Z(+eG2qe1SSXh!)hi=j6JUWbs=VS#[kSZ\"8e_8F2b1hKZ>g&`,6cqQ - Webj[nqYf%;[F3mCg3m8Y>]%B+>D/A!ps%.)?!H"[le"@_`uI1u>rUL-F3=?eJDKV+>//n\ - ]:bZ-SDD@OcaPpj^"m!&f"K&W(s+j$HUM.LVOUr6h07LV/Vot,hE=ro*YHgS[0KS:[h^UNj,S]5?n'#/A<3:N - PB0ZC`W0j\,>*Hkb"4>+$l8\!!%Mai,C(=!X/j]5l_>21bKpZ5XD)_BV[sH&V`V]n6#;CasEDPge - g$H.:so+/-rYdj],pV^8TK,a1d<*iT+;at,E^*.G(aRT^oCb<"jtX?7IO8-;Y2uqc>p]AV - Lt(e_2([%aq_F\j0m)b&'1#XRB6RCF:9Np0i+_l^/]LtHa05&I>$eV#4iQW'[BY*D1V_o3c - +@(_f.UX3OR4VWlc5JRn[S#cGV:k]k92JM#5C%aqs)`c&0`CHXNRYhs#Mb/Pi0AoX9-Bu.K - [?=YtmaHr[X$KD#_,MX7[/lbe+M-0T:YloXV2QqZaEI.hrE2%4_N!6?(]p*Cqfi6I@`s,Te - !eOirRI4cfKr%_jb5*;d^9,MaWZ:)dacX\sO>.)b\GY7*d7Cp*rRnP"]H`):\')7`T9f,_a - BMEq_H16`W1U%2`R5.'Yp[1F]b"Jmt)Z`BDm8P53eV50>Kk,qNuUm2nIo!L2.TS^WOWNVQY - o#7oXjBjPaPm()`bLL`'Z./Fs%9b0fKiEV'FbO1-W"j/\.b)umG>Zs,jc*)<(0,-Xf!T(!? - J+rLHC*;CAY!3qQCXh@g,7^$@G:9'JS3T#jiq#^[hYBM[e; - r\:Phe7bd2'1FlR&jl_XPh?+@T>LZ:?`231oX-:*SsR2u - Ha=Le>`BB30[fpLn<"q?N'FKSi2jS?55<9IC2CPq9jjkl?dG:%6`kLo8`TkSa'pQSjk - #6hYGq,Xc!?Q"`e>Duoi$(`* - 51K=cP.%K8IL*sH&J(P5FSrBL';"!=)#&;BWu.`IdA'VPA- - J<HQ*UEi'^mm8Kl32%*1S7@Kh.P!s?Bc:JdFal-?/k:/S&`_YKN3Vq,8!jT)U_Ia(Z - ,/fJGZPhor'$(f2FkbhM'QV:I=Q>B36(1t+egNVP0d*!4"$KejP3%LZ@Yq!R4AOe<1oNI3] - p$%m1#Y]85i']9>,T_.\d,=MDEIU`0k0aAMgfZ14DAZfo[L(<1&j?-:19qQSGA%Y)P.;4Da>i)"b2IFKbK-k5qQBJS38'L5&3TCPBOAk:VcIr" - KVt@ise(T%@)@Jd-eDHt,6>0"a'0k\cB;2bB6r8ac6DKeUTFgg)8]iVTBe:!oPGU4c3VPIH - 2&qMC[Zs`>kt*=X)5YiWR8Ol39keG+V=F\2;gO'A.,?>MPcf$T&ec]$U4'$OaK-h'F@Rg]) - QMt:i0CTM<6t]+91?*U]OiBh=J8;a`K=dXAqj)#7;bBR0d8[=>(r.QCmPX%qB_?@N/I:S=i - ak'UD/N.)a]WZFnmrJ"BM6oNJ+Q[)2T_%mp1l5:ilq;Yh(BLR9ZS?6fsclfddqI/5;X0m=i - %&7$aU=RUEHLil\,SLj(FL=L8C_d2:%uC>H"?[2/G^>0B]ND&o3ip6rgr]7js9ael8M(??c - FnSf0lGd3%Pg=rZbC2TSnG':CogWR=XmJY#8##tublbdc1h0H/Y8Nka;GC&ZLmBefP7:'#/ - H1,n3[ah\$hi#$S%kZHnpWhK">S1IaV.$n/2YgQ=.:a+*n[;P#]3MBkHS/=o^XkC@h7M-mD - O(aH74tJb1(.'%P:-\r%E\bG18ELilQ'`*4JGglfNp5t - 7jWpEboKViiNa9Zl$i/6(Dn\FMbXWnC#jjfGGKo/9[o\QGtFr474FI;[.%M^;o(Z(!P@C<\ - bTTk>"kRkf_=baE*"k?S:,1U^')fu#`0_rmSs[Y2mD7m7U!pgH!S@F'5J4Q`1TVR.+uc+6T - @l$S8_2"m$YqK#!f/Jjju*bNapB05C<4fR?TQR\Cf%FP<'E):7POcWD)V6e3 - SNiS9%^"C61JAKGIBrNP_:*_l^M9jDW4(!qeN/1pl>5:U0G]W#gG`,IbjV8`h,`:bZW_!iZ - +G.%]%U>SFD,Nn]/L5Dh:q"Vmi@h/pR^Ej>/,W)NEG;ro0-6sptm - CUI0Z!PIYkQm^HQNU"(QF)L!_n^2W_USKpRgDc$HhUi`s69nLd,RG?4Fl?&N$+9i'5`V_%3 - tj-Xq[g!KU[^[8XKUiB_+_`DERke6.HS'9d&4!ufOrHi^/r_;2FpKc-J&=m:i@>kj7Nk!\J - )PC>,Fg#O?`c^:JH4'YI<9aq)`%t$;oJPkbY=lBJK%Al_ahFoP?H2]_oD8ngm&rkoaF;g2H - ]0D*^"[18'l*7_R_,'&M3CMV:XH&DH!Au-^U]W9iAj\^J+,AN_\J*hqkC4d^9)2I+(H4;:Q - \k1^YZ^IS+`Z84,3.uaSc(Mb[@grr9Tp@YlQThX6mU4pV70g^[qCXHK^PY,JLJpYU^^/EnJ - ,?%6re^5E`Sd,Ps\Lf>*m4^bc>46g$`;qQXN056M1=OKE&e,a1fb#^)Q^ZK"aIf-l>V`66cS!>QV_u$SV\l - ^3hI)m,n"4OX1k/4 - _V6(;<\k_unr8_)TAt01!JJ63L'#;t`H2>1M%e&?m%$LSWPkRW1!rG/"Kn?dS\q]YPQ - \?V4"a%A0o147`!hm5_"u+TUTU\4Y`+g-m&ruC9ulQC9;IuoC];NPQ,h+J5a2AhFJm)Vd_$ - iXb5>C9C@Xu,h*j^(YWP%-A9,nIO\@=:b^=?J9[(\Aqa_]m`131.JI9E`L.U+<9dIiEK[*0 - uVbI$/9WT5P1n--A4A!cBa5Ggl]VW]nVSZ$>:$g=tbahJXeP"-/:+Y#;!a\?t^r4I2c;`?- - 1r.6:k/ap_9@W1HUt?: - JAjN9^j^jgqQc%cRf2or)6CmohE*_:NZc(K]GhVg!?GTckQ/u*7iI>PJC`)Pou5#'2]29;Ja`R"LufY%ST:Q6;6jooe/NE#11U"V8WNk;b^&A"Oe@I6!Z9 - ?od.id2+aSX:[JV?KTK#p?dhF:d-U_[D*6._hp;fmd_->nZl-Wl3)Y[gd(L^S7.!ig7E;49 - e9*Cmgsf2$,udT2cP8XcXWu;r9N%]@dcEF9btccYkL3.%eVb!`>@O;7*IQ`%=jX!%rXY=6,SYV')A9GfYNIP&" - aJ'AHUm<7dCOeR`cf]aE@Yi`6J`=EQ/sKlU7K%9V-scrZ3fe?lhaSVbjD&(?N/ffbqTQ!M^a - M-:X3fnEP]jZ6,TT@CQNeKqBHSJU#X`7dA=epPG1-*C7uRb%Fr>.n*Cb`LMCB%a!Y=+-RlP - E]7!X]g^mP4ao78R2_TLXEs>^`>MKumS"NSD^^>f - BUq*K\MdOkN7->#ddl"hWA[(,9!1-CRs_,)T[#/Z7l0,3eKm8`uu)S6b[tUXe5"$i?]nO'R - ?uVP9:1qJN6XKdiI5?:pqu3h[t8l<\caWWJQcHD95qKANo0UllL":$\dQJgRb]?KL;t*U+u - PJLIqs++hh#+8jt$"/2h-tVZ$c/PH-!o?76?QK@,`TZ0%&RZ@c?mZOp2=i25$f>g\-a!oY/cXc^$Xnbu? - L@UJVAWdlr*Nb;hlZ:=eJQX"HG`/kfA2BeV/'01\7/bi&Q+i]>W#`_.H7Z!iU/8TQ6>2[d>IhJQD,k%qD!!NEa;L-Wf\c_knk;e+ - >u^EBnl^*mJ:nXk$.H%U?]f>nf`^-.KXlcI[3=g>-3%9eY*s&DK@j:^*TLCF9NjgNp`V-O:iC;%1,lk/NBMTcg - @eK1bb1`kr,c>,!/_-MlFI.bpJZXR76&5ASGouc#AZ>/42lCH#]Y-;\JXD-8#C-Je9NQ,1W - [;$bf>Xc'drfV%[eA8$!CjjB6Y,uM8^hW;;8/BEEc-:&?`,!r'D#J#oIATup[VS+Fl[?b-r - -I,[]'G'.>hu_kST.h,QW"W^9AYrVTg(1nHf@5J@SAfA9+k+^*)Y95*PI%NgpK:[>OJQA&K - Kcrk0rWQmc]oID!no84P3psZt]63al_7$[di#dS*f@dCu2X;T"XSU(g1Cn50*tfQ8LM=5>Ca(o4arPod96LIl,pK*V+sfM'#IJ7cE[O\Hl85Ec.E#@VXc.ru5&FlunYZ\4#B`I9`:q#q - p4k3j-Z;5)G>7OI<87BGrA3nDL2f^qC>XZppAT;<=EcsKG]rS#kDb<7DU.p6of$R82f!SMM - "ro,F<'X_c]<;eQ10QtEFlG$2MOXJ3tQ$l6^2laIm=n=$q$)KZ/-n6m'6+E,As;A22%T>)X - +o%91Vo

k_D-#$\qfVh?K`)_-q5[6b^MnW$EIJ1Nqj"bla1-SZ$N?YLlb-7Y( - S?)1+FA5i]8bC^Ei1BrVmPi=F@EKQIcYYMk7qZ\5N#?t,Q%QGK>A]bQn1-9$\q$@:q/Id&q - G^)@I]`?)As>'O!"7ON1mnVI>oN"-,_0Z8eYGD)@\Lj`*;.8p`[m8#2;^XIoM#;(5B=!!6e'KN>#d)Z0XtI@o'+-YP7"kHl4^5DEo!#+h6V@Mc*##a^$%1RMl)B$ - 5/HE)142f+(E1<0YWBoB>7YYdf68/0L7\jFhrm#.)ugF?][PiJHlR8nM5JJK[X>eq]:7C7j - 7GJcrmQ;4KPpBeMskSZS?hh`otQ!gc"$B5oX#]gg[+2aO4q+_[]VuJX>\B$o^KPRoD\?UDc - =IEYOF(affLjNr9D%UMorb#&.B?^-;1EP"$Efp18_N6'O:LPlEgR.6>R8H'>j,N',JKI)kd - d&1(7d#XUu5:O1R/?V]8-F,:=BsYA@\F[;pqK&je<00d*9qCZ?1"dCc958b&$4.n?i)OYOs - l'T1;I$9Gc%Y)6sJOJ<:9B\Tg#j054QO[>C#c"Lq^40d#C!=l\^r)U#K%=GJ/8?V9-`_)K, - \P/hVRjSiu'',pZ[r1je]%"+c59``te*U%5$bKhI<](%^=k9tqF]_TWokRo6eP05a=ET$eV - HEN)P?Cr;/OpZ-[KVq"=0:#Cj4W^oKkB!2Q'k4rQHN3?g=BQ?D;5eISR&%87E]Dr[T1dX>Y - P+mom((nIE.?2)(&KogA*ouT]0,bH$Wr1^26n - aH!Rn;l.CGhWFf8(D4b.e`UTd:R\"N%C>("gKPT/YS$HV::1n>'cQ/"4m/##VMJ1`+[B+8V - Y1TcBRGMMR>W_qaW,J$R)3f(Y7WkqK=<@&-BmW>,`,^0J"0h9@^5K#PI)VEZ^s>VXT@,A+F - #Zt!#?O1>Z@dj",?0X0ejkdVES#Pi%4O4aGnJWV,S`2I;D - @-fe*D9='?8-&kQ9JUsV/a:*=`=h,t;gL,q+%)EH(ZH,sK$elb`CG%cUU3OE;/S*W.*E3r" - EJt\nBE=.]L>`paH7jgifhJ''-r6e5E\"T8?sLD,f,NmP"&&8fe4X^j@k^,8kmC+6RdoB:f - :0q4D)%n-a-Uj"@SA4t0BRAqR?L - 669?EkQk.K34P:Be\R<:;u"Mg1A,&YRA__fGfgmh;HDp>9/0;]_nScKWS2k025EZgN' - 3q7Sed[.^%hVKgFdcU$ZGq4)O>J5=:r-E$e.Tl_K&auON'B;H<4'FolFH5/\VSJIc:eooF) - R7A[M,GK:3Io4p"32ld&UXU'EaXU4_W0K<R_4<4NG*.C - +)="mLcW>okg9`IrIg - 3nU<]4&)e3AXO*Oc3d`Ue<';EuDQ&iZ19is,bP@QC>&WHr_R,_t"";S9:VW&LQdr8&Na,b6 - *5[57DBos(>HhQ.\*@l8QX]<*H0lH9r'-hR8KJ9cW=r#kOW>mPG6b2[:iS#6KEMZ\$4-km^ - 5dU'"DWS$\2MU>KX5nH-V7j5PK)Ah'gO516q7."Nf\F*dK:OUo[r98W37",*X'4e3/1*C$%=R5#, - bda#iHhs.Jq3NR&&e-A-^j`:Q67ds=5%+A(\iF[C#nHA>;[]kaV$:6_P8QVm$2B:TbIXRnS - 7<%WL\Z1YiSeiE$-;Uu5Yp.jAoHbW:6lAN(Bmbck^kjksIaS$\.i-^#@ - 4HMi-dr(<-H5Dt8`P]Ca@Y<`h8!37G`4bd6PMA8*J+F]haiB!)dl]jVn(s,Ap7CO4I@me5r - jU2LcZSY;^T?_7F3Aj$A`g'9Sa7D9jEdGHh0pG2oA;LlFO(iTrh#kSrenMfhehsKkK`sQH7 - 8Sr5OlEgg@=&6f1d@;h7k&E@(m<6rt!N6HH4Y1s0(_bT0/1WY!)LK6cD:STPle/H!Y;m=02DBu(B^lt":t5(%q`!1pfbW - &,;:U/M->;.6FZ8elqhg0..W`Y)O7N>ls_S&n'q]*%e%_$#VJMgn,WW/9#uZhj0"RG_uSn7 - [,oB=nrTO*b6&)_#kWnFj+:+s.tg3e6NA`)$RHMkB@RGf]S:>X%-4/I:C.JG5Z(/l%Igr+C - HUZS[/Q-/8M43Tn=&FBT)):]:6)"XK\$^O[1&.n&F]UI&E+42kn"">qW#+!;%+oC_Y152%o - G+s&@DWQ3rb=+,B01dd7-rCY3h=Lr_Eb4d7Uj/9+(-cN=\t#8'g(;m=(V0K0n\G.)9O'sVm#;.19G]_A2/!ioH4&]kH - $G#,?d]W[M3&IBAR@.NilJ$GI_nWH[eWu'fa$P@\\;%j*&0b'7ms%aRFY\6^_-nQs@;Q":E - Vd@WpI`U`C^@!blN,k3J?L/5Vkf!u=&,*=<)R<%D&r0FalrLO!'Mn8GZ4"7gCS8Oskn`A=^ - 'dt*ljY*ModkF.?$C9ZV+ - hbh0k^U.E_^L@\$SikePK.-/i/1sq!=;\Lf>pGOdP/$iM:0'P8Bb:rBgbtPqj'!V%!`@[6Y - -d6%Pn7n!Ra#&us2R@lgF-;m]!ka`-1_[PP;X!8AT]:"g1NU:FX5beU!4S/S4#>1(;gB,l; - )(r`1U>aSN\8DrcS0=5%FZslF#6aWAs+qi`DY!g;muZ>n8*E670l[S;GpJZZtgq..mku31)!FhVe7qDQUKU%&Y0]%VEV8?3>/_^%)"IWiCgP - /3E.:E;k!Q(JJo2tKCmPT<'*26UFrni4\qA6ZIMRSK#Y/*:ij`BFo0\%s,cE-j/#;gMf6WGF6"C4H]4\g-:=3"N>8@'@YQH[hX=7 - ]uV<'*'^O#&>b:pf[hdrtDl8PbKg3 - Ha1DLNu'c-b5)aP,t-BMEDQ$l3QX]26k=I&>JQ3fkMPui$2?51?PFRDp]4t4uJFQ.XN&91. - i"!^HJIhZfGdP3!QGt'W,joQQ7UL.W]7nndu=1,G?PP&4hqd&`a:%YJ?<7^Co$7$B:jn,0H - 4\FX;f,t9jZ2pb>Oo=024JA>[qXF+MfE9+Q4m@n$G)GuA - !JEJI3-a(G*\CJa<,TqH#],*=I00 - e('ASWlUuDf"?%o0'd#0<,?-Iu:=UilpM4ejVdS+.FuM,p[Ma?LYmH^@4O\"!oilST_gf.J - H5+7qFNfd=5p@QVA8l0n(/mWr/@.m\.882YbY]WF"I3qeKQ*30O?J9hDbKQj:mQGm3#-],2 - fb8HEYORJjP]a]-Yj?)FHt)Jom(B>om9Z\_:WaI'u`$HRolG>LDNf7o$L-m^H<2\JYZe&=F - 1%Sms.h$??c?n'et*AO'K('M08hNf=rg'qa`X*9/O,:'KLWFm:T3hKnT\cGJcSPVdUBY;O* - GsGZR"M8Q@E^L%s8#\D"Tnabn`j1"_D5CHXrNm="d>C)ELho+pjo93QRE3S=]i@sNotUHNg - @LioOXd#2WuOc3[:'nfCiMb"R5K(hH'pTIL,\^k3.mTD(-/oE34+$oG - ^5i;T"Fec.[da2(.1=g@74.3,0RoiG#)]C>m;h.K?Uqs(dgcYBdC'*7=#VTE%pic9k'4]!q - 20I3HJ#<\Q9=eU6[q72/RQ"'r-h?p0',E27K>VJ##n/m(+F;&tu-Tms)C)6-_remWL:k(>!H;:m0-_&Z'f5!Eq.!2)VC;JZLogWnMZu](H&`h5ql<6FqfC - qB)NEQ'Dn&#^Y0`3S$Y7'`)"es18kVRY_1e%B0,qXEt2KPE2pD[BdC26+[N!YPkh.@6q;`" - E5$Q1XQ&^0._84^UH:SXBQ@J>32egEs - WdGY5=ElgI%qZVmTa$"o'?4Qmj8i0*g,cAQ2jCQ<1_`;19-Qi(`7FXo5r&iP#-M]t<==S*. - Mtn\4nn^>&Iu48Zd>rP1Mr^jH*s]EQ++$,HHR_)rUO*$)kC+2PT5_L*ZH]Hb;k.Dm,W_`Tr - sHp,AP6,U?&_u)sA]Lg'>8&)V&cu?_EQ@#?WfXFE*r=XQ+\*^8_+dm6#bJhV)3Y - fR/#)8e.++JtK1ch5sVs]EcN;EQMsOdCbXqI%K;eS]XP`a:0QUHhGMjcc\p&b)2\2gkX&mU - WD61cjg`6>c-@pV9DYUW>s[8r0tqn^WVU/WgqD\mK:ctaP/iZi*;AsXf]p^i7cuIh[TD/SI - jJE_p.!Sgt[V!>f"]K,h$$Jd/>Q@*@&oNf\)f3c$^ba*C7uA7FOB]dsX7+r>X5a*guq-;nQ - =F\bSZ25K5ZD]Gt_==>=DK%qatWO=#D.M$FcX&Zt`nZdQ#rER>GCGGoj46o#'lE9j]r-)[c - d+4mtEA@]'j%1;E6LiCJE\(0/goZC2j++&4CO)GtZM('Igfj2q0<8HAW@GSVph>%3m*Tu/q - >X&hjSfQLa#ONAuK6i[EgA?N[@oqBt]&d5^gHH2m4eDiT^U65Bg7@[YSdXRH%A\mtd<^.76E - "C*iI>ba),Fp/+7^"H;5![h\dQ)ARq_;7MujoiA&UehrJU+$74ZL)-DLQGJ$;qsdgU>Bfh* - RGX9RKo*EAT"^&*89()$_&+#Qp"*!2Gp-\mUNNZ]XIkcC=eVFZSb?-EOM?#:3M#n.Z1\+AY - m)0Af&:q`YDSa%q/YZr?[.T5mGsB1J,$dH\DR3+ROg61n7Agn]BS#4Z]*3ACLo+5#XV?_pB)gbj)#nU!tF[Ln.^F8=)h_e/JR+6#*FSlZRW - 7^>25\`2]+bKkcquVU;<*.TK6_AtNf/Yuj%eb9&=@;mI3tp#cd3b"OFQ9SFiO - NQB^jfK9(=NC:e@[<'P\QVXj0>:]N=-Hc4!b?].lfbb5Mt8Pci1MJ?Us]ue[M`_kd7Q!qr7UM&2 - XlW5ql2B#!oI$>jo4A!k.I-c(m&X1_*]:dlQfqnFf'3oDHuscm)ZF]5ZO(d5pdN_X]?ngWm - o/:n(YR7kbW5&i\1U6PR1.,P_bfc@gM6_lT%YX2ti-N6fJf*'YGtZ81S[`sJ2fnAGUdEq7@ - JjPDVD`Yo45;R1CV;!7B9*X5"6.E - MabufH^uK35d8BhsYU]=a:m+Ebh4$2k9cU?B9s"Rl=$tP5+"l60b*cbEOa7s(4E - an,5fk`<_*_C*9ikM'c2D!W`A0"G;Gr_/1MkStXbh8Q[libS?]_jGK<[88#tr@+:(;]QJs:O01,S>,d$mrJGA^!FnE4$[b<\MumWMuJ-DdAnZY6m7e` - e'`OE1f@uNOG4%W(b)0$#?Zr,!2$.](Xb-G+q\991BZ^%)Bj-7;4+r7[c$/kb.*4GZ#i=o@ - gjQo=`pn#kG1%i`>\Y7H,iV!0W9C-hIJs6``>#CR,Y??'SM<]STr'(1EL(3.YFr+]0Ibj#a - :19O7%FQ_LoTN+DcB=cTrSa2ST88X2%g-SN7p[Y9RFr\RJ-V4[3Xn%+]eCE\A%O6oc80,_7 - _(&r%7ILHPs2)YAT!aM&QAu*2qQM7:.OB++D8]7V-H/a4C-k*?VZK(.Fl$CuWeZ!aFQ9 - 9=@PAPG8i85X[-X'(\Yc.mbpt,6qH/]5lYRS=^6OO?2>31R/klS[FUQfB=_Ea3jm$-/oD.F - ;BL5+5R\$qhOAm7!9ZB35WO]sPRD,P_a:$o@Aa44d='D*qT!bbXoa_K\LrB$mF;HE)EDQR3 - >X`g/iP06d9S@uR\BkiH*)hhmh"gCVMHH/"GA@aC)[T_5P'HR(=,pc/ - 8t6M - +9G;la]/`tT-IZc`R^$$p.-Z*g6F>R,TQVUW=FAf!(>b;(H?3"mbSdEuQD2j>]#3Z(f9s$E - Cs"fIqWe#0Irtr2ee-)&leQJjo)8+oAVkgJaX(!BQt=1hRf\&i8's=3E>b2fc*`TmB="/VWs:io9a - MM=37lm0'%D,N::^ugj$Rak8^g2DGB*;H2a,n1e2WYmQJk)*usN.6\4n_:2%,o+6Pch+)q* - K[CWPCleI5co_r@R2n'aH4En1)?Er1Umq?VsNYYUNn81_(C%#k"]Tpe;6$s$)n%KUS*U0:o - abPfCh<;rT3nrQiP'E59(J#VBl/=a;POP/*c$5%:]=Z+FoA4Q9ptn=#r>2='Sp.tr%oqK!h - lZP-QdU3[^B-(4.]CmldkanGZ)!qgXCc^.60;*ZN^YT:>F8:U]p<6g+7EX7e];^\ - [tSj*VrHoDW+Rpg9*4r(jlr^/s7_?AIP;n(%#ZLWB@c$hF=)dI)L.jStfAke@Ms^PhVH_rj - 86!Bs0J5GS:oZi7Y.!'\lr5We6r/-!A#"i'C#^q:"=bP4>5$UBXV5TC4uoEi:%d(j`05njk - pbP=BX'YGt1526ac`"bL1&AU+86)4HFHk&Ga*5F*/5qF*De/#dr)*mO460oIU/0D[O(rBf/ - ^dJ5i>Tc?Q(Vi\U(^T@^au2(AknDN4-n/(AZ1#%;_A0C@Q##6`8i8-:7'qg`ZtWJr4%VecW - [P-KWY0>>8slP4@[ETK6V9*`3RFek0WNNi,`8LcN'P%MRZJ_k`&'ra_42m!Ng(_P7*4c4ns - Q@38&G/I,6@k`]KJXq/g._n+52mrqBEq4/.<76FDA)QLch8OPsM6P9 - Mj<*UcM0asjT78.&6"AM7*@4!6pSGYsu4?KMdmR;4Z7G:h\_==9o>t.*T`U#q2A7.g$A=o$ - @7)WJ%RIit%;B\_A`,nVj*+D@$;`&;i,RRL#'PBq#F2lp*(T_dKdUC-pFN0Pia#%*>;1b$# - HUm^U+?XjiGHN#06S3'T4d(%e.`9GBf\d6-3Z8b+(9SCDZXLl[jb=W2e6B&gu`6#c - !`6A.Z9>%]+eAP%&^s(:Nbs]k$jMoFQ_bGg&9H;a14;kujeP%7>9>o`3>hI:HiQVKM9jH`& - Pf:eh`Bk:"^]`7`1u1m-jikC$cG\niUu"itl,%PU,'k^MU+">9obhR!$Yp#'iZL!t5dH"_% - C6GEK,:d!&1ca"*$L7q,l4VWK=nf_UcYnZ$sgs@M)rjG84kU.K`jqoKh89c-IXuM6u#<;?V - hXo8JH!\gP88;!lJK)d)8sU]S2Tn@F4XI`\IfrCg>&@#SGgX/fbWoe68oJD935$a-uY34W2 - :FB@17=7foMYoi)7r(&N@7`]1/scq;$3L0LpeRf3 - iqTpcshS42"MoQSKa%s,+U"cNEc`(?IcGee]hJGSR9q\-WS\$ed05pX^tNR>7$9me_#`/rG - #@ZCK8&`eu``q%9U/(B%@]/,+W[R]kCH[Bi[5df*uBCok`4pG#m7cIb>>9k,7 - C1YNT32n[>4%7%ICeA"f8A-]\:&jgNAb7h6GYhFP)#Cg[2"CmCD!]]%fG_gb - $'AKs00(TNZc_>]mj7or?dFY?U+J=08.Nc+Vo?\6P$8h#2kd=d@;oZd2?F8PN2AH8&:W1#7 - gZ`C=Jmm4@iSk/PSa^*[118Ze@SQ737IJ - /qn)G0B@%-QE2BlJY'a[hjMQ#;si3TcBq8@.i<7O7mNB8sQb>fN?eRdXgRj=CZ:K!`ghBN. - G$MHl=``'SCTB(TkL-K/6HfM(4jQb<+*^*kh39;E?A,]Ec@Sc)cjC:pS)obss<]8huG@_+d - AK:[+/U&4@KnLJG$&7o''<[oLnQA57(+P3t.BA`bn"kTj6jrd - *%b<1=Y:B'ggV*c5QhK4;e7B#t$cSc*1@=(nIjkUqTq[!(Q6Lh7tSjj&rM`fX6/*RlugAJP - eT[RK;$G%Kfa@Kq9pes7;1B]oH#I=2L?SVikcT;l`]<,%RcGL - @1Y(,WNTF\G&7f>g6qi'pnolonRUd^GBWCmGRd.n4h^T - KPQ0_iD-$*-9^\OG3PU&j_f5)<_mFPFlp]=C6io'VRblu^hRc$l.+JL%Y$,1+_[1?Cq3/RQ - ;DDSB'L/(D$*)g?F]@IK@7KFkml5-:3CDc_!NF)&Jj$`mYL8-`GN'-C!P>n,Kue:]B,?kje - enl*nP)F\)c]+mV]u%[[n,'hWIYklAgti?H6gKc=rSa_s - (]mmbCcQL!e4^[?j7kB:Y,VK2&nqX0sPkr/J%>lWdQETP]`arKOm=PK&G,_>Sqc&U6E1[2F - p=8UYf'lHBlmETfI`CbUkO99..bi0S7emo;lZ%[GDf6VY:>BP/476FOhPVdk%kMMYiG^>&D - &4bd7iUZa+)[,mn`L!oT)Whd1@5SYEi/)9H>9`Dn8Y&BD(c1c7lbWd3ceWen/d*tEA@&$05 - uBbF5JV:5:'tQ/?=NI/`.c_010hnMt:"(o8[JTG5u_d#3`LXdI^0(G*D%&2t??/n95oEs%N - %I:%^G?o/BYA#4C<4nap0mkBANMp47dR;;FGAfirrmEYpMSk4nW-gpf1RTS-.LlPE5bW - /Nt(f\%ass8RFV:P+)>j7^<+s-nLnjo[^7l#1uCeI-YeD.:3$\Ai9RheoU:a%2.?5ciTc0g - j\]r?P'V9=Jo;Dto/D'k;ObT@-;_)>p.']gcX$;WmTp>#/%5dt(PNH>LhoROB=EH0$Oi1.6 - =Wf?o=ggG08lW=L%E&_h9D..hh_'J67LkBpqM=I58chTJbQ?1dr1V!51Bs9P3VJCB*WPI(- - l'TIs4\8H%%5gQ_\jYp/IZXpO:e>P-"HAH?_Z$n]-O_D>.#da6g(4qEIgCn@B>P$]P'g$HP_q,J%b]a>'5^dHM;IW5>1lGIJan - YG&YSqh!<-_i'NY.bM8i9j;Z60\NGPYcJQd],hC2h`BWN#lLd^5V336FB)hc/)&a6$:%1\CfUf)G:P#3B\aJ?-;7#j,BQ;& - ND#rLd]%$JkFZT4!LFV]d.kHfIKif?3ea5s[c*Cb$$OAhkG8sL`m9UpVNL2'_'UFMMX.X#P - PqR]Lg>AD^!Q'Ssn\_:onS&L-R@\mE"f;o/I"b4AHE0u#2-OYjN@kh*@L-HuEb%,P'4LSlW - S'0u9=mY:#7A8.C1tk)VQVjg6CNV]:B#@oZg2-K;/]QC`\(ttHS,M4LIDXo]ptT1G':$W"n - oOL"jPC1WN'TKF?Gp7Qe=$"USY$-g^Z+L&Hes6"Vp,2.e\0er?Y@E'l2?%$c\rsLir/\Rb6 - .>1^[MX7YJ9QgoJ7X%1`6H_YWO!5_9e\g"[Ohq/F,WaH6W_`&H"[&__A/X&];u^2\a38>Yb - esOQ9[a5nT&U&Ohg];&-tK"MZJ3dde=r8^SgH2pIN8f/ZS^7*da9Yr'op:U@D]3R?oR - m6o53I01V<'NFrrb]Gu%5#N)rbqW%:[2VJ2FF?/DcBB6u-Ie:hY=qp&m8$SNPSIOiF7)POj7ZfYb[V?-*"*Lu6Mg7==0``ZL?gn8;NejgZPs!BdNV6'jgX%PKF - tmfl\RWL5YKOlq"I&@H0`KDh;!39G@JB:-tU!baG4EN!R)QB@6hqHPhRkZM@Ak\./cM3@/6 - /o:2pn$\td62O\GZ"(9b07IIoIR002>IICYDk#;OWTIDKY6=2s-?HXR7'Od - B;XPT/iPn*/5K$B6tu=^[O2>"it4:/iUlC\c3J2mk4>.ctPBC!RGW=s5@Z0Y>ecE8nJcCfiq`A17BQDm%oMcbT"f'hF+#uilLnP=ceOe6\@uK.on<7_"9o@6?f5%1XDuaQc?gbHQk"SbYRmblO94ZN4b)k$>'AgeP63] - !`(,1LLQ1'JRT#Ic(R`0kZWmISGA7jDNV,*^MJ7D\&E.j]S"P><5h6&9dA>T@C;EfN?#pYa - pS`4g6Y(/@4'K*gX]`^d=0A]SQT&=r0dRZ@@lbGbFs?f\GPP=ZY2\:lCV>D?iHg"aP)6RX; - R^m\39/C$/s%qH@bRPL%0b5!%rV8I).'5g36WI6HJ%"EQ)``k;LOUJ$cBog\/+jSd.4=G$! - T9E:g1T>F[h^g7F&f*N*3BKZ2`,_MLY'J6Yh[V&g$)12)oYel?9P$nqUFdCD[b0`pkR>b0F - GaX-[DO?U4:Z+iU4Z!^jT-VY7[Z)1`4NS4oNCGZUo4&7Sk.$uO'H"!e;f12W]:fk[/d(d7\ - gVs3>\(L@$FGN0qX5*,blUXCD->YeOj7L-)EJ-XdOC_l-?uB9kU::7NG0+T1J7(m]R02r^] - )R@:r#iL6b;U<%>F@>dZ2f<\C&e=f5NhZk]4;R_DcL_.MZ.Ha/k0DV=4[8n_d&Lc0F?dMlG - _k^?m8eG@)1WVoI=Pe;4+?JScm)c!I,ZFDaNiQ$6d2^>$pYYLM6c6k25/N(DQ(;A=$MLTNq - iVTr\p2=)kO'sI'-pDfWk[$?99.le!Z54jB;+jhOC%;@CpNj&M$QX6UNU"6%8kV/0STAYJ" - benDlZNhF^,7/H[fMR%4f#1du - iA]Q[R[+(4U/_MVX]L6K1-k[We=o`>^m`E:*b"jd,Ae>)-F!B1#,^jqX;Rs,-7"O`)QY5he - B`KQ7NO.:788jr2!EA'7BJ\>M="G#+0:XiU2ZmW7PQpP/4`;nR$,6E;EH\7B*THWX_2NZ?? - O'NR'RfVMJWI=76rjt#(F`bF`ZCkgNN%dN[r3K1YX,%:8cEE:d=j*`L8.HQ\K]B8J-.udr= - m,?dm_T)%MeI0o6r6%2(i_aD/_JfgeXh7/P[[lHt/%(f']YBAVhG;CrcNiRE_Ot0bSR_Ge8 - a!/Rg[^qn`GuJlhH%M;oj3^4lP7=nN!O/;B<]?mX%NUT%[K(qt3`I)$5Se - eo^pE)38qIO1"4`AgB._!*:%umhV2mr>mo9'"?bNo0,E;EpOl@'8gh7i@Ip7=A>r?'Gc^"9 - /f%smnehX;!+pP#L>O7rKi\lD2/q9MUg0*qW4)Z,T!!@TT!O9#EDeH)lCnZP"RO5g<'d.bm - :q^'JfO=^E-]VR8Hn1Y8LR_Zu(C#.VhF - NbC+r#V:j1;[Ag"=le#Z=;O - N9JefR(WK%-`l)8QuY.`:(tKgPV5hE(H!cmVG_\F&#'QYk[;)$P2aQ#Z0$oVWe!k&Ibgr&T - G>;#tY\b@et'ikV3e]d4FJk#d]X&&huliYl,7*!>2Bk6t1sl!c@W:$iE%l>' - 5F'o2oTYeLmVFJFs]%oIq3d:1rSJhN>G?C4#)j'k^=A - sVRoM:"pm4"9N;sLh\=J/)_=PqdEI!"R2;eL%.Rg9%IU^qUDo=B@+!./0uY.Ed24@^*`/eB - ,4%)ea=\g(.q7$P6Js8Dj!$gC/]-TmK%;QWZnj*;gJJI=1-FYgcmdu82j,X=dMgMC=!@-(- - ZUgs;G8RG0d:+S-"=&(128][E?p]W-=^[8&nNCF>Vu"o-_c)<@qd=]Cb0&C.2&$t;GSMm?7 - h=Y,r-8dZA0mWN@GQp,BB\1&htnh6R\*B-^)S#ZB$I*:cQnD.Pf7",:b2u[4Ob(/Wqb=P/S - s"Te/%R1fE?[P(P7Tq^XGL/lMKu'+$B+PqDR=0[e3!Eu$M$r@"sA1(rP"F!i;U.PUH?1"-. - TF"]>TO#'-41Qrb&;G/hZq)#Dg1D<,1;Ze`E\Lu?023V<(_RVL5)(r(`+u1?r&:4^9diWGI - %b$+;Y/mr('TA1c'J#>u0V2_BUCf69lS,DmMTZkbqS98i(NHVo8eBqGii@(F*saqiBYup;! - 86n-4clhL':TnOoT#onag'e@&\gK/[j3\t+-Ba:;pN!k'g.\cLND[bd)Mfh4F?ZR=)`j3^7MC\L;)pnB"$^eVjf1s?e*B'):0/IN$o"?hW=&T1k5ZGg^P - MWFEjY-4"+Z2>]Ea(F(4YF%>))no"R+-rA:pC=Y - iW,20i:[CGf#m<-;DHFb*KAD-1qa=1,/4o!_XE+^&re;g!LnQ'#<-,?FJo1XbMjok@R(#@) - E!-C*1_oeTl2/R.eh>I/HYeY=9&h-6/\?F@7FQ1J6\hd2LD@+ES023hTN$"9*O@.fLap*;R - SjsbHp03)X9((jhQ)e!612g$HR%B`+'HL2$_c`,H+EG1R(aF0%TAkj&C0$_d!HO:873jhXi - F\u,>53u%G?>^8_m];#kMI'f\54#r)et6ZbFW5/K#Cj+<>[_sNd]klgaE&RZ02Xt[Nb8 - i1LDg)q9(>E_n'6(CWm6XBZf+2m[[;bXR$F1mtj`f3;FZ>[u0UKMn'"OpQ^YS$"`k - (HYl236msQ1O)V+EOg+8=V$k.mW9E)Of.N,H+T9NK9dCI,T4ViH-5<\Xdp>.SQT$Pq-0)/)jWDTQ=pMm=RDB>EL0BqAB - M;TNYjlKN>:OREK>EJDRW[IReUMXVVncWn\ - 99mQ#%t\<09\D1&DiRAN+T>#cgD=Et]:Nga=N>%1HPb2N8lPnBbl=0 - rFf:QIWOUW\(p&SaaeojI5['k[C1;X\DX+MpVL#G1M![tphc.eVW[J1RD25&.Xd^2-,hc0b - HFZL+G)K)[j=P3aD5;;8:TgcP9,-?eR_J&#[71inW;>\K]*G:=gT4S]Fr?>^Q;E0Q%Bqm!X - :uJT],RTV,^M<%Xp;]SWiqGOV6dcXmMWX"';c^)YSp6=MUeqr$V@_4^UnE0qY^u;?*VN/ZI@L8>D! - A(LT:Nt\D%fp[_KE,eY^E#Y4hRpUT!J1B4o7!M7EXN=sXU2*D;:;U$T+Z]5aRFd5jYT_/O_ - d.bh[a'l"]*Ek=9@H7>h_F_r)dX8=N*Z^%>R'uJ_I\@_"9gbrKYMjJ\u_o=(B'NKc!O,uH" - [l\6@8GgA.hEDk,;?h9PW+hn$=2ql"`qt&"RaJ[X[7`6b[6!-b<>?&4W-)6eZoZORI$:[:T - !b]0*DqS@?"u];/]H)-k(n4HHcfZ,aGfbo>9:mU=*$J]aHuQhj'?g8 - iABZcF(U9`3Mg37#p!#KD/iW#TZ18:SZBX1/!k'D*lsq6R]eqj#Yc_Rslt]a6u/S]B"jaf3 - n;ql.!:4363tb4JubHLnb^(Vpo0A_a-,g1e.qg!3k(YhR^L4D@Yu%WbnhdiA8$*&G$Nc`^U - @ao(ZD.*^D89;u-H;-b3Y3tJZf>%8S,g'Bjq9LIBZ;*g^L[2\Y/P_P$@&3LjG^\eOs*!Jh, - LVUETU3upaLnhe]c/1W$hMAqk?%^ho]A)&nZ9@SLeKN_=Z+aCii#;XHm^]nl);JLXB7)_=- - ahp(S`/BdcFn_e<&r$j*ccZRe.K+BPSej4IFC3Mds>*&>s6IPRFU,=\6GZcI@Ik5W374uWE - XeMILkS2[Fp!lgc[)'^)t"9=h>Z!kWP3^3:#`KNP_-Vf,QI%h5e41S]5!0fH)p8I#Hu*Xm! - @reNPM&4pem,Ms=R%eR$/:SPS;fbNp9eVk,X+rYsr'NRId?NP7XDS]Bet@Hh'?k'M7453^< - UiU?apmX6D6h*]:iHgr,Elb7G&>lqOj"m0*QlTFFqITO4q-gdM)mGA06qp4WC[EkGTn(kJ2 - 5*NotXIH-K)o_M89lHSHp:Xo#HW33G>J)%J^)j?Bj44*8JZP?NS%Mhi5HXh>2l - +/Lj`hs:+oqXo!!!Q),SCOiKL'!B3,CJb%7!]Gc^nPqn"R]n-[)/nblNN$D/$_f\1s2'*;dHq?D6ul6@`pR/hsaX6V]:DS7OFJ![nuY(r1:29R\sII2*CkJ7<#hR[T[s2%rZlt> - icQ6O/AX)8F#,U.bd0^h2,1DNh_n4A4$=:^:94gZ7BNp>lbb3Y - UtNF;`*/6Z0Z6#W05*af+AWY=ogHOCSG)l^dAuq0^J0A^ZH):,+\#:'m/[1+nUn/?302k_e - C"[dI,\)PP)iVkoF"Xk<78]p<71B@1??Ibg?e^`ZrM*3cIK=f:!i@BHVi/YAW^KS;Oq#Z:m - GUEAl.!BGt?XGZ8YZbYiUd=d^E/,<[lU:^JnGm"h(74[Hr$#06]"Ysijo&lB2X&)[A[L. - ())O3>2@l.?oG@C*TMCA#s>^Z*h*pRG1KNGBmEb$Y%*bmiP.)CV#.^JX>V#Ym9/5$,>,0sP - q1&d*4nU3En%K1b<..-p%&fmY1>%c#=?RTP35KfFT#98eo`I"LXUBoGA#Cu4X7Af;gkQJfl - jJ.;;?=8s*NUIW-<'tGWn4pj*7-PnuQ!h[diar*H - #3o6n@1Z17ZS+2.DrI[@P9qk#P+SUDTtXaUf2qS3pHpYXI%Hdd;.:V8Lp%#V6:u79rQ$8i,a;&uf1PI;5U@d=k2[aLF3-%#-,dO='+B;+Ku - -A:aT@i7r,Io4[Q;O01FD2TSWjb-;+^RR-tO[%PgZF,b.1A",uh"4'#%L@l"M\[XL"5@k$1 - QiD_G\O^6b#^@8%Pq0IAWoR.D)(9Y$EEAk^O=PY]8L[(kVKEB)cg"S%.;^-(<@X*[aH'*[<@Wp6Jq6fLP>S?n8? - 4U?XjotGLU3!_AXZE!5Llc\\GGX:n?#-0R:!( - Do=IU1;/9QhcaLS)`6>kS@bB,6*_.fIjA>'RfifFPDo[F([*p3-KJ":YhWpb&n% - 3[gn%ljdSeA@=_NK=)/CZQ9cd2fc'a$e1BjnLC9]p]rPLWmJA>qLUdFeCH$16FhY=BnY]M? - CNE155tL5=d(L\oUTQc4\2S-1gW%$gY5u/B7Zu4[$dOiP9rU>n>[s"mP'G]G_'BO\[[Z9rgr$@Ko`Ws - ,RIbWc7;3W0:!P6quaBb==jRG,\bF(R4*m>XEZDL+(=a9GFI'nGZFimr*Eo,j.'9J+KN/P` - t!(XD_?"@5fS9cNp@N7`sX9@p\\gc$?KZ.7SY*LUs)b_ufg>DKkGK!2idcNZiF7Xsb]QqgZ - WsmIK(QNf/)=b)slpSqfVKBHHZ+4F^jdEC5LWA+++mWo-MRE\s+u[VNB!sXrD(]`Y-XQ%M* - E6B'Q.aF:jIQ0&4>?lKDUA]m - pWJ6prB*D/@F!I^_LFe/7?-A?B@HoprDb>2SRLb3qr%VRBJOm=Q5hk>j!.7IVe - `YEB=PJD+eTRE;nK5Rk'Y:Sh\-,2]HV':EUR)>ZSCgIPQ;;/7c)t\+OX4BY,!)D1-K@\$kS - Tg]ooZ]Xu:0p;Z7n2f/-cL!I=hID"]:2JmY>E(==qmq-0CK+qcc - WFO+`VY\AeD=96Cd("%>1.3WMT;l@:JZn^:U7Pj$Y!C:Z-3!qQ1Nk]Fn9O!LbTuIe6_aCq6 - QF=p0Y]%4IqB]&!-$s%ncG!BBGF2#P:.(23JD@7eSG2ffedfp\b1qC!XMg^C)jqHbZhs]h- - @,(Yn_/YELf(@DY/PniF,K4sT\`1Pn.[SZoHp4V;HnX7`aHW3'hi4i;ib4*Zi3d&qV`\W]u - We"OPr)aB7N\Qf7u$Q?32%2l5P03e.`6NOn'N\;>U^0Bt9di:M,iO8'HS&>NH4)qfHO?R1n - ^'kL_oC,"J+$nr1[tu6:Rg?L(kJAItQ`MF5j4Y/5$o*<,>G - drC^1`=;h12_u#,/[YCX?4RX%`C;f1K`afal6uBk9BYssH_0H[6$pV?*qRoj:6%iSa$o#&Y!']ua`QSWWFC^8& - =H.,c\"KffgRuU1(;PlD4L5YdoMS0u.M3YA5@f1.Cjn]EL.DF[_J=\9F.(!HF@'Ia`,'T]R - uabKLdrun`OmWhP^>ke\&""faF"E<9INJ;DO<8I8K,dmCe-cQB#N1k2nRF.b]QA/2+Tdna@ - U6]lj="B\A>tE]?3\m&SrE@!5u.J]P3g"[6uHt9"N8>$VW*cJ]gHfP:Sb0Z3m`47nE[C_"!9Dl]:!P,= - j>>.H&99bPN,fi.`_Fr:gR[gt"dCPXFd*'h8S*V*="O3;(b=s5obqZ!M[#%dO.AY/j5Y`Cn[,oi(fB9ae\c)%Y3@'%T3-eeM,Ft;5#]K@dQfulhm7CE?'NV^WA*Igi; - ^rPa!PAnt'TaK0miQGAXg$"_8NLs=GIT?Pi[g(g14=ZkE/W';75g#]5;D - 6#h='ir7qg3o[KlrR>t%oU>gg=\F>?)QF?W7LX<>:lBsFe;O=5eWGkg3'Q&FUV;^/4]ZLd2 - fMsID8EL'\faigN?iU\FWq$]j)S\>V-Ik4el6CbLs#4>>1UBV5[]7ZWq(K;l..^U@bE=URbM`nfb+>6T%Pjl"q - ]a^-:2?8]Z*-0j96hnGr<>SYt!4fg9)Z&d%%/$= - Rrm@GVj[mMi*&Y,V[EW=$,73]H#,>iH*FTp?e$/g@6s.O&aUimo!I/gfP+/7B#7@bqZ*lEB - 2fZmk\YVkPkS3jdo;LoYtZW6R,nmO7%?XlG$1Yt\--2/"Z..V4r%L#RH5bjj/uNs%N$L@9P(@JA+D!W[Uj!0/nFrojb@>X.\:1b. - k,@+T"\ZE*[0Z0C`b!@.m?hm2AYH[B&\P_A@a9C4G*QatP[sK&BkBNj^/LVl\;CDKC"493/?6l*>qnb,fP:p6p7MduXukm - I)J$-DNL3Q@auN0p@7#(J%I@4THdW%V?m))mV1GOmr)aD`=KGP/`K8VM+gRE9eqUNKb3*Ol - 1tG-t^qKF,?#sbX[q`@]CAMb`;-p46fc3+**J&&:1rMSnlL)#L(Au8DT%l6&Z401iBJW# - 73!^T/6Z3&Cp77-^3"&Lc6]VB>2P#Z=$ZN>@E/+VAmfsYI%$Kc^E3B@_VZZH:&FgafE:C"! - fS/g](\(9$-N;=sl^0aCEo#?(2L7rp=[EG&-kIm3H?6ufCrF[oR,=$C_U8Thd>oTod - TQTW08;KDe+F0@EBpKd=8@[b=dp.o+>Db>1s9;BO-p!7@G%q,(^2g.,rp%N'?hemNH:NG&2 - p48.pB4^fr:@oW@G7Qi\+'SB9>TF=jpJ$Y?m7R+kHh[hac6mH$=(Cu[C@mQcp2=U3VE\gGdhL5Vfd5CEd1*9E^rap:N:Q=F84(?Ei4e?GC - FTtHZnk7G5jJpR>5efGOY=HmtDig$cBlg^2LH\ZtVC5DVlu[Q,Nr6q!:r-%3B*^B5`6nDQ- - ?K8#MF0o2/^?f3Z"6rpOrXe^TQUec*[;(TVLT?>p,=(@?ZTVmFkVlo6F-qgEP_?bA`![VD_ - PhtOeN(?bS`_>F8Ldndf,%#(b3WU)P)lA*=FLJH:4^MY.)))&4A`q!s?c>`3CRO];Q\CjF?9X1NFT3:CR(pdG.Vj_<,>XHKHdm>Y?`b>$H0Br - G/795eCsS.%t)9%D0X6(+rbdDcnACGQ;Z+QY$\:'qfM]ASWdUS=P93k0n#]lV,VhKZY>WMh - lO)X2Fi1NeQ;Ish@;VUA>jE^'29NKVlo1MZb-3+%\mjeF1Y8?4O7T8gf#maC_'%HVmuCW0V - &,@6Z)0bqO&F3/).,IrNqsg:Fj$#VCjBRpUt=](r^Ka70>D - a4Fl+nY7sn[`=#'\c9nl]+!&9t6uOE@6&]WJ6\.D8BE,5a@Gb_$No0<<=`bVG,].S[1d - /N?*0)ui(B;fou@7ZJ.+1/4ld'-e\LSFm=^;_$#c8b9S?\#E'Fd,$1n.WHmt&mY<#[SbNSS - u4Ep1nE+C2*1,(cMANZ]T^RU,.4hIdnE3W%#E];&1hTT:R+nPnQ1i`(C8B'HmqE>'1Ie>`K - gZF;9[OB#l$t*RV,_HG$9p@g@b(2l,E;]m9SA)Hp6duDG6<93OHbr8'Y%<\OORT!aBP:=!` - HjagSLG"3XcRnLdVc9uD,3Qh.o4$CCtUPe\r`Y(^1CX6P26_%jYm*f@UHEHhUFSD - j.;!>;>gfS>.N4OmH:\@D6$t]($Ct9piT)U0X16!>3q]#V-trZm^6Y&q)-?oCcPLT&EB*h? - aOSf8:0V3**aCQ!:J)'b6.%.=PJqi'pdSG5O$*+*!Ng2Js>Qhu# - u!FRX`3*mQ(k9_QBrsViUM@$r>8.r9hdh(X)/XDh7g<(64:.6ecZtNW1s - BEo:g(Lc=(o3R1SB7on_(KR]]:2.o4F$uVmD.% - #p9!BC9$CI01P+5TZ`XPYhBT#pI<% - Ek5VFE7AY,S?H#FHt5^"@B+gE=n-DA(7l$.*g)q$93.7;*#Y*m?FbZYZHB=W1A$KX&IHn\S - !29-"]@XIp.o+in!''D*=lt(T#670f$M)_9[n;+BlrkV[8-_ieXPUJ"=Yo0)j*I<$fDfRoV - M/rfrFR!to<^fMk37m0.o71iuSkjXAXXJ!gU$uql7p4"s=r\3L;(WX4PD_okF3LEH;-:S(O - XR$5-&3*/MGQ0+'^5b&SL1(767Q%^BL>abVJ78N))2k:SE$9,rXVH=jWIBAq*26$##PY_/8 - 1RNP-Y#K;JK`^P#MFX<([p#WF$%um5(6>*=GB.RiW4'^k - k1XUCFD`D2BX_a@?+[@`/oh!)[uTb0qos6N[H+pnB(OjE_g$)Om(QPupthM!HLD%5\!Ohj? - ]30U01EIc=,Qh1gQ-J/Q3+e0rod`/EIdOb"h6KDmU83UKWo>1\C]U>?`XWh/PZVgpdYj'S3 - )OGL*FRGVX`V]:PLK^%`(4q$it^Y[Je)>Y9W,@"c" - h87_Y5d)WRoqNcG=laVb=&j6R#9nGX?JfbYuEC]frD(1>:1%g;#g\Wemf=j8sn/8!,@SMLa - =anZ;mkD\#Gh\[H*K;#qjoL_m4HCADsmBq.LbcdSHo.B)Of[[.^3C - )NR\Z>t(a#-E#BtVcIPl?)mRHXk"E:=_h;QXnAR$f%T:nCV>/![KaFt3r`W)?&>i[*m*'h. - qEJ0S[3Kobh?8cC$cq?[J%&^g:M9>D9]JtG6Lq!G2"N[rQUn;Id+k!UNQ!0'SNr=hq7bF4_ - lV)]!K,ia'!1*Deuns1$8#T]C1&Yh*]"6m_%EP-T^VN&Y(f2s4qp@LLr.6^p1?VhmXPWC(; - >X1'\l[>]4rSN^'(ZmW@JlUQTA`:V_%C>ig7SQKi?p\b7C,iB$FeE"6llH+rb0]ZZH.c;W+ - N-Pto*?_(ZoO4-(t"mLE8U@V-PeN-K(k^>g]oq&Y.qN!`!h,c[\IP]W$VTS/9K4f,9!b:j@ - R3d/"Ip(Ba3>Ki!,7b,471(\4[&_KS.qY!sKC;n.&XT%&VKP"i2aV=d,d9oW:3ic0,"Y?'OF5SnX&FHH++q\oc?/'kZ(rd - p\#C8!7e8!EOF2qlnoQSm^6qQHqJo`#(9Q#GRTqnIg3Dj9pU&sI7@VWnMd0CGpf<2Zc66gD>bDX=9V.\@7 - "oIl0pc[,X?J>T@>!6UZd-mJ>fcN13Rp[?%NcVg-l%f(&VYsN-rO!OF\&H#=mqaaV80;>EW - '_3]$#*7]=bpNH>jSO^A=R^M:&%;J`qO/mk;M7B&l1j[5LqYGTQk&E/.QjKJPc8QuVoPJ"0 - *H-)[1#KA:(YE9"]4`.B*:f7Vo^PZ$S)O&K!5fA#uK9UlSAUGMLM:!qWa`PcqOt)r;NY>%o - ?I#$GrF7MOVs6O6W=C%ot9d6A+dsoV]d5`n9mE,8(MBooUXm:giks4VJC`Og&Z';'N.sNrZ - A`Y4'AcagD:+.0h;(X%2#N:u;^p)%!L;#r)kqDdA56m86*K(pTb9I9iP*>G!(_B0!n[B6)]ae[<+ - /H^q.;aX0OkHI*43nP^P"R2npn*R?_jn:;k3g- - W$"pE^P%DlFh`Pm9rArbm-*b-I[3m*Ll,o]htZ-E`>*nHG%J!0Q4h;<8]//IepU'QIH6&s! - 7&^FHMC+_]CIdD6r[=!5qgD".lQn1>Y9P."7/&1D0?d.1Ag.h:i7(im(c;=sW]]+IL3(DBFpduIdVR5m!O0Tm8tnT,PR. - iU32UJ[^<1Mn\)E<5OA,D2/eALf^d-M\/G,Z(ZiNq"mQ:BSVN<=]6=10c94[\@B$HP0dRn` - M7A3h9r];DYE]&):c[J=Nk>(.hIt`;pP=f.D&?W[/6D'?r?g!C4t.)KNW#;^k"r_[[2c5u^ - 3%Zai#mfgPHTp!Z2dD[Ac%G#4c,72#\[FDP!a5;996/$sX`nP)?7C,f0 - q/^oD$ZqX"gUGVV/7tkY5FEG-/@mu;!75CH4<1?Mej"n'F8$DGVB$s?E\Opt.Kgl5?EfgW, - G>2&52A;2r1fmGZF!lY(8gW"Xds4-!^b2UY(=SaB'SB*/m4i_Q7Pt-1oU\@5rCBnM/(Ds=V - mK/TcPuML:%XK>[!nO1#>t,a9s_l,eK7a&*pqre-B/#NmKo\;pD](a - YFT9?KJorhP;Bh:1u<:uS_EMZ;W`EZEn?ErBnZQq^l`rZl,'NOC#Q2r(M9j]0R?ZjsgD_?) - GdpOn?6dn,*Q'kr8q&jhs@+.hXAtrfM]j.l%=]PK2e[%`1TjH;%@TBHq[GPW-M3oaO@_k@jQH>aBLV<`*S>BbIbV4 - SFJC('S;-\SDo>A$mUsQA9!/*C9Cq?5>P.[Uj4I,=/5Q$0$51d%iGX@9`4@2:gqrK-3GQoV - aVS/p@/GpA.idC3hHX,Smh:[F8,0A;;j8EN.;SYpN=(eLOIS!d?.+OS^Hjr[ToOXnODg0C* - W,f*SYHB@f4dG8c9+q/f[mFZ1X(QVL]t0llk?Fa$D:aO>8**eRN]F8($%O^/Qc@/[HP'1ZP - UQ[Oad\H1lm1k(QijlCNW]90d?R>-:N6D[#hK - S@fRE[UcJYP)LJ6J:Mg?;WB'.3YbG,-38j,*isj)l.qmfM%BDOe^rsm\$].sRIX:B?12KeM - c"F)GcH/i*`X[U=DF3L/?J^W\XfPU+qRY[h]rns+ko.phNmcoJp<21V`]E8$]%O9i7Bh*hl - gE'EHQ01AEpXePYthR-mO$"Yo];P;YZigIgBu7g3O67[ZTB>9:4]^2)XU`=`u>&dc2G$9]] - K^Y[9I"Cg>00KBAq(L\B:^r5:p6Bq]3?g\%5bn].Mb%D"Xk;JZMafR+(M&4$0`pA\WS+ZYjK - b)o'.W@D2QY^\b"F>HP1MYfU*6]3B7?*##AWTYT>&l.dYq41i=60#(WEiLBo2Rr,b72mD'@ - ZlDTC>Re4@:UiLl`7ta242ns>/$V3D^"ZVq]9TW@+2XOP_;#gm]Mlg3;oH;'`k31rS7T[PM - ne%U`*@9=S1Vh;Fi[ei`bk=`*.uAgPK,e\add4_]6h]UWQP^*seB)Jokq"'Ah6B"=m:2\hako03PTcrs - l+H0I^2oqo;`7(#0Q#i3lcD:;c8T,JlH*C!<46dm&FF`P^t2LdJC/Q3q$eTs$Ar6NgEV:>? - Q8"DnmSO@`d/('n@f:%QJh,W)J=kH^pfU[4WO>G<"-pmlbTtQqp]o1S_,MH-4eD71%4g%>] - \#90H:&R#C>#Ejm%GZBHUKu-o]fFa$$f!!6h49j2I9kWJjj9F_9&8eO]ueVALYEiA3r-bF4 - X8P/`ap1r9YLm#*ICPPiL$%<^>3HTqB+HqDqgi%d1o^hl"iJ+7rC6O,Cp[DJPC$N8jT%J2q - I[d\t.sVr\XUMjYl4>7P/SLq-#st?C%kC23+sRVs&/!m[A,[:Cn`,MUDEj,gQ10>jnPNIH] - OQl(3\^*hJR0Kq7)/31d28hQ?$kYO!9Nkj&E;KfA;dVsGJE0`J]JrmpSqh<[=plFttNI`lD - KTBlLDlTX"e*p;n?p[3L\lsBe^)M;k_POT^CnG`maU16ClX&iI?X`Q`"n*MonXjmorpT;?BI[@`p - AYTo'Q'L->P#UXn)#kp5?I7pMtd7$m%1cXIrY;AJa%ZNL - eElp&DGis#'Z1L\JR2n_`7&I\lL_S+^3unfQp8!!!-#"U'Cm@1[Z_)Ar^.THVZ@r&t>sMFA - ^dGdKdn*/VO@Ydjmg%3pMDit@1'ol&=b3.uqqeZ`1nRCD`MdkORn - 3Y$hs;:$D6fjZ6s*QrU%`g6FiB*2C`WEm"nA59I#\l4D*Tb]\= - 0NUrp8;IeP!u[?4>]P)30Mn[d@"m),7;Ln2mclA(.k4Tgc.EcoZr(7h+ - 2$uNL9!T]c6jP1W@<'G]b'cT:SQbnCkO"s"C^jh=Vp%1YU;Acm.VY5Nrjh^GCr"[eMmXo?R - Y&mMlGh^p!%""L36g5[n)'UFfbD'O#_==kIme%7AH\SK5b/\Q+-XNe(gYL^+ga'>Vrda-EeFD!'b0Wf - +=7e&Y59fSB6l#Y%1?0aEelfm;3cuP9Fc7_i2u=DQREP7X8kPHYls38 - W)s3^>Y+>E*cDRB%Y[qL0hI*Mh#ZW#-4E;pg4E?]pj,5_+o91Z-2E.c<\QEqZPZI:g[eE?^XO.=p/oi&q60?6S`AP*Nm4_RsHSNH@t;"_+FQ - r]C-6jYa?`Z;@oM\I#H>@D?n-9oSalX%M7F>"*/`:fr?j'6/F:4aNJaJ/WiHqK34VDl?ccO - sGdl@EpihSfl#j(5hH%k=:n[jeA - iHN=5^B`^onF,ID?I9u[sf3!1YkCn5]hSh3J^2Ye"k:66(/O@Z:c,:"gaQcb=j,ndC5*Lo0 - 9:t=1<-Zop[[*:j75%(t"ADSZ/"+KiIUIKIL&Yqen8?G'h8(\%E-Q?`fdY`+[\[N>cZr1]k - l?Gp(`@'iETlec?A^?Z^-7)>=QV9SL8GJ5k=;5S.F5e(Tf:OBs$o!s1VF/YNq`1(7+%U00_ - EjP1@2>mK:QS9#dct(T>`9PsoZ_DT-*\^=6(+WmXq[>G78Mhn+IM`Y6,hP>+eoJYGk=`N/S - WU1TBnb-oS.:fara.+SHNOY_NISO5ih+a)O45N=j_LJ1StF*:0N0hX#tC0^)#1YRu68#Zq7jb9e#1=3=L]h&>tbtDc@]PMI=C]WCr*X4@S+\W"ldoB%4WVHu4m9"uojHjLR0-%`<8q!0>--fN( - )@Nc*qR6hqc&[lC=ElGR@PGrjcrLKesT7'`a+O!)`lQZOu>d(#?`iCpnn@e)uj.s;7N*)*J - ODCRrW1&h!kN7jB#FJ`:^gG=3&M5N?c8h1Zkt<+&d]S&KoP[^e>nURgD-YWU9#Ssn06qYGP - VK&t!Oh\Ih,4*%oOkhdZ5XGGk^"U3am5WH)d[m?b7j?\)_[jo^5^ILY<(s+Vl]K-OC-7V6FGUhX7Q=. - :jZ8Km$Z>+Q`dUC]4O<6]h>_U*k/b"C8QuKn$i&jPJarg:$8(F\9*2Yi7M[8.35=bp+D]8F - mWf1h?1d^rnHH/[kKE553I23)q-3RT']i/XnCO_FaUZ`mSW/dGu!nXHb!ST7,,_,cGA?7:T - j@2]@-N4*LQY`P,PB2dWHWbft8]UfA<^`q$nY5ICE.XT!RL)Np$!qpV6E-6[a;g6gQPjfBH - Na^_1O!pH1[Uk:,!nC<6;/^m6mk<+-c0[J6C]JkX=1ru. - RM'(6Hh&Kgb2"D0LG+[_Yc,U/2BRT0uH[@6W>m0>W5#d3(%4:6[Uo3N&j>=4%%4Q_q[@Aj? - 5ls5XYH86hE]5$pqlP6UXU96sN*tCdga67RVVq6aR74F:B\i%_0t%7+2ke<"c>A(GQ=mNl2 - Jh0o&/e810oD_5p#CA6"ukZBF!/7?eRpoM`_^3lQ)u`O$LNKN^fl'ug)5`Y$0YjBY.FA&\X - TO#1"ZA7`aeg-enN`Je%j]LBg_W^\gY`Z/j8/8D&X8]J\`7YG_MjDr94(e59F`cPc]"Ed(Z - Bo.dT8!J0e1jPMUG=S`Wa#n1Xr--%@J&]jt7VmND*,!=i0uo6%a!?#Q"FWgGK?/Fq81]'W9 - Sl9pL<('^6SsKf*/MVIMoWbA`p>t3m#9$pM9.l78OS6R,_JD,NPb=<`Is8hAm#e8)V.MNB3)]-$f:GHCX0Hq&Xne8Wn*_OTr9%9puHbM`Qq\? - tQ\+q6`HAXon0boUf(&RsFI'GP,KM).247'>E_QYf3!6]2_[Z`JN1q>knZkbDnZUncPe@Ii - DY"SB"b65_IZ,2c:[QeiE&c##&a^m4n,eTXp--C2M_#@#km7XISZD>[f![#).:!4\\b;9"= - 3Cahf`@[kL9A;KBbgdHhefn)/c$LWX;("W(WgQ902!hNOe+4/fb*C@-9?baFeDX%>:6`!Yb - <3e.;R]?i@EgO37^6Z%M_I>*btJhlQh8/?D"*\=dC9&<:!DX]bg%Ga^.r4s5CCjOm&s)bW& - retbC[]//G[MX\B[e@9e=:1]`#7VnkI'_5cJ0fZVjHnd7\O0:)_R*>m8#(/PB'd9`4pn>m% - !^kYQs59aq0GpNeQT*)93]pu?RDm_/";AjMTF8QE`P=m."`ouM^6dE@FF/0<8- - 509a"Jf!7\<,;jqi0fuhn3L");W.V1A6>cLhq'":5%f0rHd;hih6AX\p?_b,FWJP[l - ohG/[3mHT$p-.899SFeVqPUKc - !H>,+QWYVnZl7.iC3s5@kHQ2:bi?3):!_/G1=D>?b? - ,c!3-J<>Cae1Ct=YoJjN*fF?t'$rY6=KXM&;;6:YWD&c0]+&UR==Ie7Vg4_5eV^bD4g<0"k - MCRH9p"erY)[eX-N7(Y,RC*BZZUL.d,GD5d$e3.P.b3M81?0D2.jgqA5koZn_,#h>fEjG+KJe3$Ei*,Yf3\LD;:qXGM>i)hcb4ZN!.r>i` - -/B;C"=Z@4#%iF5gH@_tI,rLQujXgc"Hgko&MmL(Pq:L1[^ghj(OeHi107hN_OXUZ.Yegb)3: - uCtJi"E>'%Js!ChnZY@3^pGQ.e(u8Qr]o??lgE@(-CTR_lBjfi>nBE*AQM9@-3b4gX\Kg0g - OcO=hU+Q:qa\U%R.2d'ttsF?Zj`V;p8^bHX2Lcji0IB-@Xi!!aR+Ciq=>Fr6sWUIUZm(:Ak - I4Q=++oD&Wsu?.Oh7mMlW>9.0^)@WeT_S_*(3+Qiq-f^9.0FcC!]hd`g-KB^QqGFuj?V - oMS^6@Erksj8O4dN!2S;\j"Yl_[$TV/uX - NV$/>>Mm6'#Cgd,hoo@?HY2,G@:idC$;6;bPQDq%9:ll3=R<:*9gnX?U];'W`g#:5R6 - ::]M-JY\md*lc%[PV0.G0s'U&'l;+:\NCWhT>!R$11%CCinYNp>;";=DS - 0J%bBg,KA4XGk.PJ?S[AmAjVIF5Aptu2Zg!UXRMWSE3@r3HggHL7.E>+O1tEd%e8[B!:4%D57oMS3l5Z\(#IZ-A - L9LqI>qf+`u(t;j^!O3<(uD]mN(.MQ[,Y&C#hNcc'3to5F`$EpD<>Brpmt%^i(fB]Cio,0( - IO1&'O"I%eaj4o^9IP^Q\#(?-g:/kAs][P69c.B.S,O?U,\l59DQKhK_,(5')3NFh_8Prt]^k;>%t541AVkB4L:@BD#d# - F>#McLG:jA@kuu2#D - 97`oZK.CIItJ02Th-&Qas;miB7WB6.P?%6numl1*-V*fIEDeQaS]C:gmUgYR>\Cm^LVg-\q4E?9f9^cqR!Ah#q4sA!+/8RLUWA4`qBV - #FQ_8Y8SU+)27n90I+-ZK7Wl"4oGhd\g#H2qrSANm[qDY>KbU.ZYVu!3\qN%]S-^I=WTDI` - GHT/3T=0h^1T6d-=qk(NI\#4Pm^A?HkqfJ,"pU8+4P57\eqH(Q/n#seK`P[Ja - a*`rmGZV]Xb`);d*fQ,h@MZB!GDgK``$Z=#bh/_["kA#0%nu*N3d'`YZOq5e.@4Zt`=%,AH - '9lq:eIT&Zn\:@$5"_>JRUJS\C-l`"h88U8U`IY.<";0NH`>J:/b1G*ms\1$GP[mWo\0]IH - C7f##lSek5HEUBFjH32T4V3qkPV-fN7P,rcJ.Snc-qlU_hqfobn)]""YLs!]OPk\CZYC?J&OtJ;VWS=%>C\@kYV1gHDPT)8 - ?^[h(4.9fen6JAH_r"9XhEG"p:U@Xqk__L1g:tib) - loBUF4:%R>,VA@MuhmH$l2(/k=1Mn^HcPY<6u"meV>0Oe89.M7Bk!9(e(^"9bG# - mPM6A_O^pg"7^5X,*^t#>HQp1dglV9.EX[R+ag!CN,!@WMI3ZlI9N2GA0[V[?*R1r1,(Ysc\o7Iu2q+AO]1G<=%?XOfd/oBdDV;)?.M2 - bl1e'g#2j4N0e9e;YhA]sN2H(t6q*X&)^%/NZU)P_=fbdnr824OXu!gJQJj%4+9heVtSKch - 1R22,nXFB402Q%>A:l[KU#>=-_3g_>J_W#UPl8F7"4YPgo?=@cKDf9@uTa3[q6D]0W]Vkdj[6d.&F+"WmJd - qG]#Ld2OMC!JRZ-$"`e,>h@5WYGRdF5A.C]!Noc7iHIf,k^/^RIpq)HNk4od8KP$UpNM#'R - $\s^S\mBjfkmj2>LgrJ(2k8rsDMau9n5cZZ\G8=dM/0[4Z'XGgDP*unHS__&CjUWSVjqFk0fd[m5jj,hJRb^J#IG%[kZ>*/m`hUFW7 - 6:O`EWM#1330NW!b-%\el"XOl_:E;2VFrUP-F^@$p7Ig<%:k1e/np,Ap]]^RgBd^nZ>9ESk - Grib\W#%B'k*fC_:O9Pa$-iX5ir!,d&J2,#VR!&,\2STbm'In1K/& - qpj"V3.qNfeJf8!pV),Re1Cd4RW#kk,^$1j=^0EYM!/<>_N">EPj&1cj9E-):AtNH-XC8Vo - MEjWl48;1;533=R@4>aLM7%T>_CW@MOZTU*hH8kV/V/#>XBNtTl37d2-/,ZJiCdT0aKa_rS - <]XjNZFP"JLF!)f'^Q29)?V$TI2W5pcR$/S(c+*@'-=k\gdQVBc\8*[/%(_sM(37BnX#_Ub - )4T%e=O"se,U.opRBbSOS@?.1+-Cp_JhU+eGEVYA/%]i?@=Go1`^?[f$#f:JVS=>K;V&s+3 - A,]:5mQu&@#M!IdE/Dn;kQH*WP3^0RAWrI&9K=#/htYVD)OFV+^PalV5Adp\;FtqLqQ#s[/ - r>;.AH^2UV!E)t0J?Iko8,V"@$N%\<@Roj9)S@^T - 2k2aH7H0rl%;I9!bR<,+7_NAZTj*Rn@pllh:^V^f()R[I;.FXXHd0"EcA:L1"i=g',d\lYp - O9e.\uh - *^s%VopXhqRrq-aiP2h0QJu!Zc"ZT73Mfb'XVa][nEY5JA!R2@==\H9/%pYIQ0k:#p7HRY[ - D&=BVVP1Oa]Z_[ZFWrRmaVL18+$9B\Fnjuh^Xge*$^EP2gX0'$Z1=ZIL!VecCj)gm7C'Jr- - Lnqn3/1EH0n<5I5lV+^9V<?Y6IbuB?Ua=oI`eF)Fhg.lH=WshGh?P3RQi1s.sir2pjRYc0J)(O - "Y*Xc_c%O>,k#iBf7cPfhC5ffaVfaX#S1Gb@bWbOUDO\V:#.o>\.MU&[m.!g,YVDArTrSEF - )>b=QZWqm/OFI<57(hUMCQL:M5S\eA(i9*,99e2s4^hP5`po - ic4+V0o>td3^o%)2&]rdJ/Ks?mS>Y*"l:tuAJ+%&Dj>aL0,qCk^U3E"n@pFT9#d!"=X,A2c-*crp'f#&qekZD`OiW,V!b$?.EgVRBHBRMrZt[3;-7T`]L@ra]o"&Bp51([n_/+*TZ#H9a@=NWrql3:>f`TQc - 6Xebk5m)bf+X!i4SKgnD8dIqFtqPFpE9LHYX#X%e&BT%g1B>A$PKn+7]$uZ1;)eAF=qonMY - T@XkOBCI/;UFZ7!mR?RDZ6^4#EsG?2ue"5eM[C&,D9P*.kJb4$s5LNP9&l`TmIc`I&)R`nN - ]Zmm'UMaX4s7`0'Gj=OF/UOL*Q)T7X1c_S)4N)JsJi4)@EZ\>jjKH*3eEj!L"d%'TCm.9].fh]ugbJo#BN$ - s7$cpj-YcSQ,V[ojemuN_EE@1t;![mFrD,@J1:ur@Oie!9op9@a7;,W/=9*3C`lVST9:9=g - Vo,$pBooRfbd>&C?JGcYnd77%D0/ERr;[8C;%PQcX0&%2eN>G:LdgeVu%Q#SQ'#P7tBhq_0 - ljX9d*>beBjY,u^AbcF!!p!)u*jJoM;=9eX$C>HHSEY]kZ23_Tr?.7+PNgeYalac:$CrW"+ - ;,D4Op`Dsp79VT+As!uBiq!!kp#[BS-^2Y.6/WY7j;t1S2*MX$-s]V&L11N,LTPW;CNqj3@ - -F+T/'O]E^qIU`1CuNNj!ZPY:EM/-rR<#P05D^9.FX!.8nZdP(oTLh^fD$.FOD0ZKj+u9eQ#$.LH, - .P63Jdf-^(M-*m+ql0Bo6h(]QL/5mWCdh=8f74GNV02i$)d^q9`,r.5q0iHs]14M,YpGCl<:"%7MB,d-(d+A=BSRH2q)n/'72\pIlLAb30TC_F-AT4P - rTME3RaHY':Cm[T/q%g3g6a.e$D*A[lY864&`aR'>HY.]f_Lr4L<'je'gGnf0&ZZ4]C0"PM - \Q&j$&[c51A[YoBSUSpHMUR5;W:,Oi9K4=#Qkd2Y7A8P@.G1H;m>39@IlG'@p/?+B0T::PE - RI1L=1;G=&R-:8O.AKr7:;-UD=/6tHN[<)#a0/l<_b&@m:K64GF - U^s-k=me<99cPOeDj?SUDuV\*/23K_k-tV+WX0L!iO3CZ0#pKb6'Kb$k>^*naBI89dKHS[HJ=]-1iEp$HNTic - H.=L1Y&op[VBV_Q_ab,<0?9A_gHr9" - JhAQJ8s/gQ]62*Y3@;No+q@@2rB1aK54N(G]s=,f)L0LYo;6KI5e!HpbR9e"RGKMF#LdalS - !oM]abjp'K5IU[iXn`HOohBKt'\j(h!6G@+4QdKlH:$3%]P[YeCruF#[fYGCbSd4G;6B8TQ - eD&D)f(W,S7@ucTPMK#8H\FYFK#Dh$-O4`iCfMR@LDWeP)hG:,1R$EVt5E6MkJ^;r"(9`2q - mcmpEOa(r1=VZ=d,uUN-4*=TafB\WDnUB"Q;fUK(=7/5;MZT7Ok$oOR0,V^^Dc>$aCp@o'N - XM$[]7N"&Q'f=Mq1FnkduEmsMmq#g3CVhD4"#k)4?152hH8,PLslC[=6=]_(/H^% - [p(3kCeGfof,3K4iiOr(a))(1i^S!)+.MAb01q;78OishFan%$Gf3\Pntm>s?WSo(s/g/FU - =&U@P!Uq&b@GZ0=-7IhuCU%I^Lj7q1$feNC/Xr.[UFZtfqULK6[B - 6M6Yo7>9We.XJ)]ACVZ^VH;gJOAS+1,6,LoS:nb29/NTsks;MYd@PHW@O:J#-b:Z4"FQ>@i - Ike$Ah(ZTAW'gLI$^o=)=j\[rlmqd6oacYo.OM`WE=RQ7tk`O*69[/6c+>A:\G>IOFP\Jnn - ]HW.Mfhn==`[G0KIeCd#/5^pY_3^06QM"9<0@;Ea4I\6+1MK%R+87ZC!rG49?%_KR9Z8;r)q&1pW@41`79s?l- - u4#TuK3UbXq>,Q,h)t]us[0bhUmn>YiFGOIt_g9io459\T=k - -Ieej5@Ya%*McLT<.r+jS?_9m3hd2`TEMZ"G?pWm+*R!fg<*:;-&U!RLB@iVVt.=9M9a'B] - ;aZWGFr3+Z,6cW5;@\!&88GkSa3W)IoeD_8[g0'j>nKp4HEaZ&Nu[9T+g,!q[W/"& - 822G\k#SO6#GKLah7\P0F9a\UG>)r^@G@79E8A6Gg8Wjs#L*!T]?Rc9a)g%K!ScB4`VkXP7 - j`QVob`YHe>Et_#7J_gjkl/0hoXE9g9d])pDog:VB,%=qr=^s?f$5.N?/\@D8kKTXl-a^h# - 93@gX3$lg3)+hQ3Lf]?7Prg%YgPgBKf;OSf>DualE\Li^^'3#1M[?4lZHFj"DV94rK=*Ols - EekO5P8Vh)"^:1kV&h[t6ThOWkM$Ht\^h;25hS]Tp%CTOIsgb98k':V7P'iF'W7'gA]-%8i - 8am=-q5]=oo91XV#a#LI8SM9;7+U:<,4d!DbkJ_n$NftT(#>ne*p?>n=KUH - o`S;aRT3]/=aqSm+"ckJku&Sun/i&.59rq[),BfC9gr(S5r81qW?D6s4X5p0UPf^Gkj.EV-WspP!2M'5.!7TNN@T4LGLk?]Xm;Mbu^*oq)e!?_@'W48 - I@/qB#t;T3"Yb5P[Npp*G5kT7&]+28H"#/$<2%eoedbY&oC<.,C7EAC/cMWc.m]X9&D%It. - M13#!,3$%p+QE*+@l!=4BIifM6_.N\tU`T*'Tgi=ndM+Ajg3?0qS.$)BAd4#c=9dGqC@aKB - ?AmZ77:1c1o,h>=JQ:bePM/<_e-^i:mP6s.DO\;7mk>WkC/tH+7d:tPl/GaiuYLr!f$S8I, - "KG9L<6Dn[D[4"'_D&2eiT>N*Z)slkiL9K?GeCu7Kjbg@e0G`unL>bqL? - _Or4c47[/`o6?2]KNQ3TXeD#>$@M5$*)M=o\/V;=(t[NlLkobj[VIlfjM7R^&FXDO54D)3b - nAoe]4:l3E+Y^;f,@lh>4cjL)/%L^0l5NhZXO]:[%7kSm<*q\_6Z(Enn@#T-s3;HTRj)ZbV - j@:>;67301t)n?._6VW"f(b&ITfYT"GE2D8Pb"L8LG/GCphHn_ofd$nY05k'F^f=_aV8GC$ - h44KTZDtA"s7*u(3`5N8RB[=#I4@5W-DBp4a^+PUV+@g+mQnq$gRN2bpP*D^h6'#i[-V=aK - ="DFL10lKU1Bb";bS)``/4ssL^GJU49NI1iD$/6I['M%(2bu4TXHLeJj+TZj1YgkR[PM1=5 - YG&Jog2CE`:$+<4^LX]&8!<=K=9e9 - -1$8_)@.AQr6CPt>6'[InH2;q(\r1>"K2O]g:Xc&Gh)Ffgj>=&t;>;UEu(Ve+EPjfMY=(@= - h2<#6k"@G4Xsc#$OJ]kK[[pQ`pDeQ7_$BNt4ZMf%/EapLTt.?FVIJ_'7A]I$ANm4JX&V5D>RZ>`c - %B>"j(et2_2u@*>][0,2=74aRf:&J&V&+O'B\GSF9P0E?'0Yf5<_6\8U`)*"B.irl'>l"[(i*].O2(>h2Q7OTR^7TZ]1SU@@lW2T.-R8Y3bKY3TrIG_H - 38LomT`0_gq=is).#%abTC'UVEQU[#hNUs`L-krFMa_YskHW3C)`aBZUN-6M#ZoIY/X%lf8 - roX>KS5R4E:"dcGg0nZc;YG9+H/(mP`:7be>&QM`mkU^Zl^j]Cd2.Q1k0/OQP*Q,BolWaLeG - r53Z6.M@K1`(agn`HjP+;>\39X?Z4`rbG+A,u_WZ=^$Po>\4)?iiHl-G]bTGmZ,3mE' - C)MYq9m"L]Wn%(X6q*\P!S;^4/16.g!"'EoIh^c+UZ.D?&PYW66XVE>+9;B$gD+d&X'5#cO - b&M-#eR1L0V"W!3@m?)sX?\,h)9f*?@LNZ"\/(Y6dP==4<:mbT(<1;`RtiJo%DKCfMWmCC1G[JiQ:8&Q`2Zgp*u0i^6f7!a1+^c%SN@)H,_Y=8dd2gXoKfqMn.rXc&jcIL_*.[FGddD7aKra/m5BsCDFDl#5s?K/;JnA7 - 2sGV8:-N*D#+IDNF5*"BL5d1RC7L1]P - UX<:N\YU-?`aV0R`k\Sdmc_d&MH1l;a/B7)OL6p"??ZMp#\\7 - ^6"l5[9q.u$@^ZCHg;)fY9B\j2%1lgA-r%AmN%@==U5&eVjf(JAmH*(QgS(AH,Cma'BTfG: - b8IdZMhV7G(p-0MJ=NclohHu99%+F/3s-I1o&]V*\k`!&:D=ReHU"pmb^=KcEEZNuL\pjG1 - Hg@R"/ouq,[V4rqRt?uEZ(%oQcGdbgq=!a&d^PQAb?\23mAa7:3PO/$*:$%$D"6*fk@Nn+U - Qf`7^"[a4B()6#BN`$FcK^^S./]n.Fkk0ZqmOh_>]Z>#4Yg.sg.d\D1kZ.N(b*"eTp!hr8B - FLRl,Zr%o[ZK$R!iVF9,Fi+gr^5hYG"1n7[@DdPZ`;?%Jr:fQ1po6=UqR6FipNkBG%Oa?At;[#Ej`&LDa^ABq+)`k;%j1J=7 - ^r-=6bQ#(O%^jLk["*Y@MlAT'hn!g:^haZCM'B\)cG9&@]W6]Hd"f$bN'IL/4=iV)K2oMl3'X1_^mh.6F/(r%X24-9`"X - (No4:="g`'2;M6"t1E_=$6c8>Du&f]E8@oB+#aXkW46.%^+il/SI\ - 3Q;W8`l('\49Ig\.R./@Y/F_+nFB&+pnp/#_N].4<$T4)"\,RF,+MlA$Sk!M`%6":a'<4Dn - D;(lAO/rL]UX&U4ER;37)oBm7hg0e]72YR*O<%_5m\#k/1sEA7OHUl#b6.K4DCqQ(<0%(_L - -u,FDa<:"3<"M8NLZXgc@sl>X5rg^U(DhoU3dh<(O);a!6('b^_YUT1?O%&VMo3*&EOiP;h - P'1!GYK'I-4[UU7D+Z)",&["^aWPXl4=+uD7$$iW[bCJ'PE8N_u*'U;5U?:);d/X+2dgC;; - h5Ke/5b-ZU;ZqE`:)+JYa7bJJ4jB4VZeAY?772[:>J[!@>fdqMJ_27?_P!LAq:<^Z$,m'@) - r3*q/%4tJ46Yb@F,329us/IU3/'PZLA*9mBPg*[=brf4T67403mBfL?3*afs4PH)6MTiB:S - QlCZCRD(hdPdT=aA\&BHE7fYkdK2a:'5FZZAgALVTn*CcEcu;]\L$0l:u[+)T$E`U]R_tC; - 0>t-M6e#=i2b9:sMGEcSWA9"Qn$@ld#An9q#b?F@"01dPup/:?;5r6@2Mh7a7b!cij3:1_A - "Zj#.>KX(:H#U!O,ds31u1.a7mm2!WFD9$J?[T2K,GSG^\)RkGK?c7JY58mG+g0rj%%:3@7 - J;o-$X^ragTdH'XD@WcJ.U0N7Tb:o!&o14uDZRPBYBJYL-O=cP7-iUCeOEegcpr - :-B1cW>DOn*D?;?:i.MXo`:g>/l8)l;Ne#Wb#m$?hp;fg_=\>c/M>Hq_D0`;XIN'L$XlJ.; - 33WR%GFD"Gnrh:=M8h!c[hT'd?t^-H'd&OQD&#[V+K0f:t30M)"gL#d<1kVG1=?u)1>7ZEH - N-JQrO;ge?)`=>uoKaN`=\BZDM6e:gfNV-[/5>F'D:eBL - rmR=gp@>7fn-ef@k[M1eo`@MZXg(N!;UeS/#X;cWp;/dVtord$QY$2XEgE - !NQ-*u>`[+d1?gI8PTS14t4Xjp9qA#;Ql>i"$YI6:6h"l6<4;b]@/L#Cb2hHh*&c?1D&>gqK!gEC[Eh-<$$ - jjW#lm6e#9T;CKk[G%3mOBr(X,Rr70e]6*k4'_a@hYK3;N:,Ml-!jUFUMNHH);$X - E)T?ck<7Sd43l[Dn4+i&X'YfbBp!!oU3m@7;*mo<.!-'-_#e\CMO*dPG7lgu28^+l32@jql - s4e6srKiQJT*ke?"]inlWobn\FXAfkFk-=IZ/;jH\..Jd8E["oa7gdRH$A5gu`^=e%1)oab - g@/JWHjWr'pj.soZXNkT]@Er32W#X7&3b=4_;ZlEQ9@nNmk8gZ^+KVl#\m2Ybi - j@%m9;O^7jEMH8p8'XQ7,]9bGo]1WA^NMu_XHpj&5e&q^2E"Db$UeON;e0uq8u=g-.FdFRR - q6^V_j4EI-;Dm8J'EqWb#Tm$hEkf>rl\>@c+)]7^/rV<$iVS6rY-/^ja-(4im]4i"KRj=H)16k/9rD+j" - \A\O:=4XeDc8EJEP9AY_Ak#l@EE$PQV2\a,-kc&&<_nOC/72DU\;#!Sl%^ed#j#]T_<^F-j - Vp%TLA(/7bc?&*UFMSZJ5(mOjj'q3X5&e]0*G:+plP?R8#*pC7QY8"Q^ID5?U - gCCQN+`]\B)X!b&Ud!8NCeHd**h-rJ@`$nm5E$WSrO9gFK3fSm1)YLT&==#k0#Bui#^#*qjq&Ahb_QU6Y'Kj*ga) - 6Jj*HD6UokPDLFojXiiWca?Ds1_r"fhRW!YVdai,Mk'Z"Mk'Nj,_'%AC%>TLOnFd6^+P2%,kC8OpA"j^f1+mgn8AJWSKL8!t0W,O'U$ - LT>2/NW(0"n?p\l0c/s9=r33mVf>>m11"/S+GfliD+:jb1#kJq`!c`+`]q:EFY_`2Y=JcG@ - YUB_rJ/ao_6[$jq4tADYF0PpB=i3g[b86bDeu.7%Np%j6=Q/*TjhN)#]Tqn[ht+S7ma!W8a!T]13HF"Ja`Jrt%mo[(6b=6CmLG" - 1lkT'FE:XRa_\p*O]0G!@D4MHhWPa(I - SZ1p6OBJbE/\Gomgj7oAgn(&,E=F9_];UH6j7R!-KMoL2sr&]m:G\R&mP%4Xln^1H9/"n=)IZG - VKSjpU#,BbmZHkN^/'57op-c^^Sg:eIRE:7]Opi[^/3gAIen7Mp#i^M<8maC:%n9ZUc3:.R - JYAhfVp'*b\Zk!(FX@)LWu-V0%-_IS3/@`br5`mIM,HU0@&Z:.]%6(;"",*MS%2O"T87[WY - OFecbK0(L$)0;K7A - caI_'Lm:k/NG&,6hK#lfQD?uRM>/fbCW6R#??<$iIfMaS^#\28(d"c]0!n+dYm,7fu,ij+s - 4N^k(M9O`!5%"_D+S4V_gWDp;`+.1+1dQ&l@D`X%UV%VGI^(Wf)80\h;4][OVWE*W;q1V-S - 9qG+[e;7H`G#BY)\C/;`:Jo8kf"+Dc]_ZI*HuJG!02ag),H@CL.h%hgo8RFt&DO346q=@TWd3QK5G"Z]j0H - Xq?4[)24Oh57u?`%7\c_',]o*BC]=Rj9[2Wea'PQ[.C?BlSDjk:a!'P],?*EX"Y4'1ZRm.@^m5lBL]B - IN*gDO^0mb&Fr$YJ/%lOH4V,+4iaSmTkhD[E:qaA(RYo.KM-qOqC.p_7204L3du%"-c.cjKq0Zn/[:;u`^C#0j# - fYe`gS_RaOM5>JHn#FZ8+oo@3"Su=ZgN!0H - +cD<<=bg&P))dLo0hb@gS&^!@aHPk6Dsb$T9MB^dCJR/->_V4e5h7N3[741%4@pXcAkd0=[ - hS._ktqPN7(<9:FCQ@UD2^R9r`V3.)eHHo9Gn:=fG))KRTkaeJZmtk:N[@=K#4PQIK!n"=, - 6QX=b]`c'k>/B3_jFFa?=$Wde18[4%^`,+R/_hbiU6G+&"9[+AL?679_MXOXUf:tj;dX8N: - &1K(nb.g&SHh,(@VqP`&(Dd)JoK<_fWZI160>HE7.Zh=I:@gDrE+-R%@q$%bQ=G"gQhFE7&M+0#.R1aK - D5K!!>/7Uf"D)/gPak:GRju@R>*Tg^dnLGYl7s0nKc=bENdjR0A6NsbjF?@"d"(XN8ST?\f - _iY`u.SR_o*dfc_q?ILCN73CMhM9&FNR[*lkG*)d2o8%^8S6TeUbT$/cMD0?Z;!C[T%93]H - @$oLSH5_HL8i`"?Qj-2lM7\C4b#Lo3,$CJM@J$"7bBq&CIgOI0SZCOHRg^9b](jC$pcs$nJ - gF8X-a/=p=i[,K\pXYIPH*\gY6@YDG0H/pAX70EK9o-^"\nJ=t\WXa)c/c.D#6`mbGFLHJa - _&]!qD1htt0.D?`8;[ncPQ>R,^rIMokD2Y,grgP'V7/4qlGGi3s&J8j?q`4.G/hcmFDnBM] - h\;o_3*#W[7^+I;a0+H`"O)XRe:WIaq0'7,DS9(h0a176hj]rC$oI`5L3QET(l>rQec?%#c - qY&j;B6\@/T?oVp=Q1?2X7^q$eG3T)lhq'eEfRQ-\K:#$]`3Y,:2.QA2dYj`bFeIAIF7qaG - Nt_P\8cEJbPR>gmqWH=pQ#@,4*QNUrTfjFr^#<8037J2S#H%06fC(MPOSO[^3SSSjLdE(ko - B.AW4s5$Gcuhl*e0>tDV+!\YF5(?CXm[51$a4j\`978fmBo8`Vm9Cn32W?q@2uK3`i'HSi> - a(++f.CkGdB$!MsTX2mFV:&(rXtB'da2pU4DLC7@S([Mm,lSQoN6n%M$Z0"lcn,.tY6Igi$K - uU?0R>?JEsU-!.km.n&.[;Z0b$Np$kR*'nBDFs8IfQ'rieNmKF\NiE-Y9*%e,]jORe.Qln< - Ns=Yg4#&Rg.9<)fcN*1))\[Uk - UWD)H"H";#qZMd<@p_?)6jDanmO%(mk%C*-kNX9dBn`#6S6a"-8M2#Z!@.1?q$s9(1OrmV`P[aF"q]r - (NG\kdV=Y8aK0"]J5M4]%J:oS5;El_)s4CY'&+d1.kV9/0G"[GOlI.ag_!VaC?g< - -kl]s,qVOP@4WX]-FXYD)0cbb[hh+q&ZkW5Z4-n&igU=&N)A-^scFEF.E1@YqBt4-W6%[o5 - -$5]+7I<3)G#OZbJ:OV`b\"+-Ub'Z8"B2]-5YT1@o3APD:iuZIoms4B%q8du-8NN^V;E&?TqFJ2j,m?Erc_,+\6[r.?,!.ZfsED - F$B5?3&HacFGi-.Db8Ai46u)nZQ;HQK/-65!O6UrdWX&8K.lcm`H+)W'29QI6:"5brJJ?3' - Uls^[37<_5'+8,M).[5[6:n'7F_9,-eCac),8K461bO\P[-^WR8PFh;%_[?[!,(4XXI)B;, - ^eRe=T,"bsKpB;q$4q'Mgr7i@r`g4S;K22*X`uKi1m,;)#s]<-p-8SPkU#;Ud?aP/U$N!CN - *83`MGIoXe/S7p.5J4g_+Jo`mi<'2Na(\(=jjQU'g#G - r;d36gH.BMNe2:N1O]<*t,uSS[EN<@6"]VnG?$4+U[G>1gh_-j,5LkZs1[S8noiMsR=B!AW - Q$"TW)`#t@("EajQ*F?=$!DDS2Di6)[)@alju)3h1#Wr]JPAG;Y>Ng#qNE^Hel-.$.i8E"( - f(?T2KKSY4MkaBXHj)r[G_:TB0WXl?*m?L1UGra#e%@4!lhZdoT+ - Xf"5sS@rg,[7J"E6Fu=F9pBIQ&oojMVdrT^R - 8O>@[Fn'H/%s%C0?=X$qGDK'sTgY+qDH-j,B%;0n+^Od4E]5L[<;h1:G;WHuE&S_W=,23). - sTMFGIFboQ6U=7Dg0YEEHb[%Mq56BWi^&8JEg[Db8.e7._LT`\]_a>.RL@A+L4t@Y%r?n9( - KFC1P/^IZR\qdlaF@6.)"r,]dl7!8caP0g9qh&]i["Ape8@.gP.["K30&!fMdNL7\;33LDX - r`Wh5'6*JUW,K=G9E.p%B`Lo<:lUWU3$fTh3DLPQeJLfe_T30B)cT8*^%"'LR:)YR/)`03K';NOdVW&RCT#Zq5'M4WL>iJRX - )$)3O,'!YFE)1S'']?=WWrt.uUHuX'$XX.F,HF?_"[@Y?4E-9Atf=(S021KU?2-fc[a!l&O - CnNOf"[)"E`VpPt.LQ5LWuRE(*+c&&rV[u.eZ$\+7A)j`SuU7*@9=t-1l/YDkaU"EG=\acF - T",rZ`TUJ<2H4cq)lEkfRMje"F>",'P8Y_YqO8;/&>#V0+AYSu2MqSQ7H?-/L"fE7TUO"em - \r3?[NjtO'V0\K(q'W%#%?d0XV3j3@\3Zl.LSQBhP/E-?'[)\0M3UePXN\@EFPC9R2NeZ(r - 1eaSj/3fS+tN)\(RF*0[AA7IV1)DH>$3uhf2m54R9u;oY;[.U3s0=9EI?=28+ih^pH`6\>& - ^g9E*%as=,U@nO0R:!3EIpdGO^'d"`VsmYa.MXbd"NUq`D9.Ea)>Gf>C*YF0F0bH^=?/pSi - =_a[Ni2LiO"h4=Z?/h>:FYqiH%)3]p+@pdNcKW=^6ZaHY - GLJkWF"TaIHJT]>)(,YJshL?(9#BQbggKO(e5#ag>!gqt%7$ah9Xn;k*m1gUG9S_@u@g>hRM0kKS@ - 3d(B0+I1Y+U"1W\fe+TWf22TTu^XTlj^jPI[gl]DM@bOctZ!;(LRpF:0;f`sBH.rAO4=t5> - o;mYmW_VF5:Y1m[7QrINS6Bh!K0:g4a<]c42bQ$0hG`uW"J4 - iPbFmCh<>f9[7jRkJ.)D9X"CIsi3jSRp/,J^dukc90S)^%9UA\^)9,hu-d)>tr$2A&g^0bh - ZFMI9k_NccSEZdMm\a>tO!\?c]q>HJT+^$sh2&Ze5p6Y^SgUoI85D[FTd0e,Bs=?9.#7V;3 - .XZokt_4u_C`(Z#$ehEFT&UW3YChhO>XrL0iT(C[^V]=/Y9Up;7 - 55jS=l.aX)++DJ]et"!l#La@&jc\64St"gSWQ^n`[soXmh<0#'8T&N0M#_82\h39@F1t - 6L+a="8YU0Kb\A(HO@Q#Xq!?!r"-c8%o4c^_B-N^=U[Y402KM*W;;lQj`@=eAVFY8sR%l@[ - 4-Iou[7ZY]!D8YQj0]a]cGLs#=JFA=Ks"KHTNC?!4*:bN@$t$ZQ.k%HMbKGoBNO[,C7BdRe - S):GNN1lBa&&oSCE;ij)OFqi)#Oi<'0"3GnbJ\m6:k4bk@V)l-At<^a_.rd%(;4"R]kN2)* - 1748%$b"Fn1uuj$16(nb;p.VP;>JbORO$*Aj[\VW2MS'_pil;'*1>\(Jt2:DHdeoD9T"mg" - !ko(040XgXRQeaNE`4H#PIgWc$K02'=]X)+hSs19rmPl`t(ZiJuK:h/;c]F[HKW'-,%@-PB - :F6;pX0.Zsl_iUoP&Aq>.]_"Rk"8;u<&JQYh7BVjZo/5sK=V88cHmI4U%9-I97M+'Kr'[\] - GoOhc]Q5>]D9Od^aO1Kh%mpi&R#f9`e8#U_0>+>'_U;DteAa9a&L#3>N40PEbp$oX9_/=T/ - kIbpM(H^:4HD=rMRt:=:Fa6lXfkDrN6e]peJ0VlY-["V-o!jjo/9F^`1G?ag*"6`F6s=AWQ - k;J&h>1_#?83Toi"o8PuUei\8(\=J_&A0LKmn\?$f:HQ+^)b=,T4W?Rka1F&uI%,B_h/B%j\1?WYn)mA!Q_Q9'/(gc$7E=P=MWB43&c`F!01(/;2K>E$8/0ig5ubBR9Xh<*8 - EeNNGB?2#ZOQ!5'"(P#IC`SH-tf8^)Yh"UcqYd??+R=er#(-?6D#[IXdA4n6gNFDQ5Obr,n - <\87ER9!7Mj4:YA+Q7RA_1Um[L3]2"H.@\:?KhYMI:q2mBio!cAsJB`G0VD,ijG()\*2I&T - p'+M(93d:]&#B6kr8%.OQ^ZGag'qH<-(i4gZ47/nBo(fYIK&O:SB#u7iT:@LsV- - WM!X+JBO&W1F#8@S%#;)?!+1AfX2O%1c?q5;.jR5Jq.f%MY^/L!_1t6ffg3;g_AsE6/g4BW - D;FJnBqFmJ4LF8Jg@0@5C`[1.I)!)5;duKofua-O;pGj30*6d0;-i\?d4:&cdr3]^s3(OIW - )qJWA.36:KNi*E3/]OYOEqaB6b"UP)s:;'mP:=Ho@#A:fBr5"J3=pCuXuR>UP9.)ZEV%4+E - EO\r8F_oZUC;p:8f1;5]j=]HH+9T(=gJlTr"B)Uf/TTZVr5ro/^80?i[RVDuJOa4,2k+p\! - 7=o9<@P]s@%,m[S@$AklRlAKKgkHJ?EmF=?-^tSgj32DeqTi!:r:22X^V::Nn;m - jocgLQd[sUpnR:bf=KkgQ]3*e];='9YVtN`ce-dF-lt(7@[T^^PgC7h0Ko!%!G.gqfX_7"^ - PI1$!eQ/^oC+XS)XnI(M=K?.8/Xob/F*?0iknQoEKfuf/VQj0KEG7!^_7"L]^e1O?$1d60C`]/#O?n>N*0h*Y0fVYNOliDe.7NTNn-O\r39BEY_NjpuTgSYY3)h?RPTt?cC)B]B4t_C - Z^uEe)8eMu]]5WjjAaEgf'1um.)7R.'ki96]ASo^Y^c'dajSSTnD-c\RH)DM@)uH#lmK:c1cSgh(j+HpJ - '?do0X69@AQZ;F>Ykg:/l5^+5Et.$R3M/@tS;KXR/o0!`h_4"qB;]e,dF.mj]AgLgX*.59Z - [%mHj*P-)G0Ym!3$2n%^"9&lPs:t-QA4n#(W1KI&`S1;I%D[0m%&7HNmF&T6%lf=lp_%XVG - E1M8TgAtl&da6ga;UV!86oEalq1$$1m_R>]KNPUa559o*'WIAE[O5Mo60+ns3hO04tC#2WX - NpMH<4KUZ^WV)tcct/LMWpCNsrURQd!7)R"Q%pI]:b&KT$2q*LB1P2c7?n'$qJS+f*B[5G6 - n3_Speq7X8Ur@o,>I`(jNjLc9%T1=6e_Gi`<2*Y=F'e1rQg]P=Wq%!l0V&TP%=QhpG!@AcR - T5lNs6ejl"@_D7;Qj]o<+uL\,mh(Z4--M@F$jW&Jd(jBW]t=r:>OXp5)a2rt)RJcqoAdZNd - Qsr?5VqoD0g\)Tn%'b9$:4m3e+,_^+eo_n\YK-j'GiF1OHp8X22GR2+(V,6Yn\DA&L>7VRr'Q3s7UP1PuR-\.CHn6,:"'.KGQ/DA@^%1h$ - =q;tH)u5==-$'c=BrgR&OKTK_-!'16M!TY!THr44pL6s-jU1][u`-G/LP6nCS<"@p#p:C1. - T+7)Qe8L-U76o7k1`Cs%F`'91OY($O@=P#7+qW$oIi[] - @(^!p]8U=0FAp,"B>u23`\L,F9/X[&83#+27\!dG]M_2:7O3q2$^6gpls.L2!fOSq`dpt*1 - e*\9D9#=ZMi0HWI!S4$50(<0`lktagk!N4Fca7;7@[]tKN:VtV8]fj7tc#]6ub?k7(k[;+\ - Z(\6qbU#:W/th`iOrX1kNchM)9lL8IUMFr/=/TEQ(m[a#&Xk[#N+*Qp*W%4LAZeb[:`&1CQ - Xf6VKG]4JYSCV*fmQ_E2_RgHpuGkt5qo4Q-'.KGu1Mg(]cp7;SS>jKHRt2S_GE$03+ee*K] - VI`Z,c9/I*UZ4t*[.hL?j`'k@4DroaM,=)bq-TLCqm]8)N8ce` - %7:mWd."&YY.[#bN,ghoHbf:&LH5Y,+Oikg3Z,3@#bYn8Gos5i;,mlGYPO)PiUl-Ut),rpI - t5/5((:34LIqS9Z`59bCUDP)s&MRf*G'^9JkPIbiL(.p!4lJb_&>WPNGQ6Ll`r#2]Et#0dsV5CPrU]I0h_t?:Xo)3/H1lEm*>i"dH(g8/@!Vd4&@+@`^N;Bm) - 79Jf@4nm:FmP7Pk7l__5AS<;b\"VbgoZa2:Uu$bQU2TV)V?mhl=p@1aO/;7.&GD!`J\mLf? - H8UuKbVf[RbJo2S49:NWnke/(pb0NF*Fd1k6]"_L*]s4&, - WdH(j4:o.1YN^&q#edY/NSRU&7?,ueQ;q/_-rGYHbGZ.S,ceQRDPsr='0@ga7e@TqRo`/#R - 0ND[Ed!]8&9hEeK=jM5==:K[PATq&>=&%IGe1G=T,mDp!78[WLeD1qjHh#8gLK@H2f,\!k[ - -P8^M_t*3eXAkTrK\^GPh4u5=DZqidna)a\t)PB6Tlm3?),0BUr,Utd^-rM2(dO(2d"Tgfu - l]bgi(7:gfU\78M-B(-&e$+9I4aVAV8I5hEEMd=05cXNBT.h,[5]3fIR0OotaU=6JO-T>>;e)_C&SrM:i'B,6`j+!aAJ - 9P[$AOgRWUgNCVGD0[hjb)j4O%P:MibV7>KUe7TpPj=nNZ_]k:ZZ_cWbj<+V60/`'*IfNAsOh - $*(C"\UYrh,Uiff@?>@p%CMToEjRdg;M"f.U_(CjYqVbe.$?>%GB8G,@.\l>33'I4ljOuB\ - $2@i(\)n4n7HInqm=ae%N@qA[pYe`DL4@d7+4Fc0sN<\R6pYg+ih?FetmG(o9tFb*9iuOVV - <\*2[P#>HA61D/IK3Qd?b][j=U@e^r[AQobHNge?GJ*YZ+gH=9]S>IEu8?7&ZI+P\9,[D^* - Ij]c2i,2;LYghnfT4@J!?Zq!PG?-XhQCs-(32W&[-hbB]_"8PkGjj6@qbq^MH]tIpP6=^!Q<;o0c[P?^Zb2dG;@hek$-$%C^5Z.M[_Nm8lmGD8fn3/I0>1H%%VI@L37p[>r]*2fn3_ - dS2;c356jl0mM9;:\7H-2m4PAIA@V5OHB%;E:N[%tD-+kfViN)`eFO"QPa%jN*Ye)&4djqU0*NpD - 9BW?6[@h7ep,ck=7kn]Ad)WGGR*AT,fkd)]lb:%'_O0GYSZC:HlY*`q0-*d`Al'!"LcBU+7 - /EuIPZM'`$:73_.b50ntj+L8;N#/h`frl>n"\Y,JRO-F3'10(,*Ap - 9(R,X6N0OY>ZNlXmW1VRj!7D6DW1^>*SNh/2$*D=']IeBto*9St:cZP%E>L5ATY_L0k2F``kjC/k-@28l&OmZk3B) - jZEIIY/f*_iHM$XZc0k#dYD2W57e(C,YjRP;me62>?F+PSXDYbdC6nTJ1)4M0o]p[oDe?#I - G5Q9Ek\hgJ0Fn/%f(^qK!cQrin*^)B7fdP2_sf;Rn7M'+?O-'B$uaFPE'FSH:7^n3$?#kPn - )(GNa.0qp$N]N6o[Zmp - +:2"P?,o!oS.D`)U))0UNFe;n2+'/%I;p%U>G!Aq!Q>"E:C;SS

kH1NC[pLdWP7riccH?^6-p?uYfS> - 5g6. - 4+rVu,0o"OLP>eT$#ncN - r=qqp873XJ=9R]8PNCG1TaLn*9-Bh$^;Q3oq@5].!7V@m`bk=1KS'U:sM58"@ - 7u(",<17AVTe<'=@2.u1:9>h5<\&5pXZgr9WEAAlX!L)L*3WKsZ8sk?AS[B3lZ[%0`oVNXf - Pc!!V4-L6\mB=kloi55Bte#NGWSoL(Pon0X;MGLB*3jkj)(2HmO!@Vb%ELI3>SLTX0ZQK]$ - 5E=@C+SQG$Ag\hfZKdDE$=`rj*[gM*h!Lh?L$Aa5HA3r16C(T@)9_q7R8\K:1*Jjng(sY@" - +_n9DOY:8\c5hXpGe^>D*^bM_]74b"!LUUTXer]SRpbk41rA-2eHDt:pI^p#@(mQU,Eo)uj - jF6*NkO5(TX^2PnT$Tp,u1CCu1X>(8H:t,@I_p6Ior5>jF:BSORHq+acZ)`ia7*XdlnOAYq - K-/&ee6qgcYN/P#8!6PO$-9BTp9+kM<7)Y:3'eiGQm+4eUZjeHT;3 - O^/.aE'7(I6J,[5gh-ofUc!<)OuY<)^.M.jJ(NNCQ!,o0!U0I(0%Y`F"l-E`E0TX2'3?3[^D#'>':&q"'P?:G;%=.I+*#V(0tWjc1X:0DU%o4YBVo7Q4n(H;U#_;fH+VSc":=?j0L+c#&:Os8@N.j4phY&#^HLar1-!+lYm - %S)U//iH.Vj]Pe*NBU"4-'.1j>7$37W5G6^,5ATVS`-\GD4bH#ndh>Mfq+1\XdO6gSKV*V3 - JZaVDM+k)qK@m\Xa69^T-r?)Dk_&/dW)(VR]aQ%kh?lpU>\]Ceu%dPp8tdh=[(6>lMG2h[q - Qe9X/RS\NqL"oqnhF,r*d!O?q`pu6@J]+lUD[if?gs7::4IX - ;B\Sq9#7&BFdpBe!F#kq>cn"$>N\+U35(!^D0LL/s/4.[hKDqr?Jf_'[LH*-hs+-4h>ITNe - ,G5TqA`d0fu=mE'Cmtp1OhKO,5G97&0M=PJt/,9*Hs-q7uSkn+akk^m9i-N\Vr42OVp=h*e - Ih2qb3X:+??:2&HYO/Y\2]VQubKGJIL&XG0'*VL."Ei#3eitNF#@Lae1CSA[_L_p2@:9OtY - JlYl(.AY"*&E>cR-LuE9b-.@8qF'`iOi7Ma'D@CCP3`Q3p-A?+9Y,c6mEO9Q=8W>OeC5n9#/Q:8.rHP>EgVKT.;rkQSRr1pt@P:tSI6ui_ - [AGc"6O.l>/kt;3>UmcK^`1'CZko-=E?^4JT0hY"c,hS'@O#$sWb?-Okj-0_/APQ\uq3`jI - 6j&iTMG?Rl/JcHEdJpK_npe0mo]ULcBHHqt?.D7LS6.OlEHV?GVCf@gU>kWO$N20+1GRPeTF?'(Zkifr*]'2WJ(2QdfnZr_"l - `bPFaX>=n*^:JShCfHJ&1pYNZ$=@#>7A$tX$ER635sX\^,IE`AgJhC&E+656Yh&5u=io]7X - uR#rG7N)'k4`78Fi1ah0#H>31Mq#hMn4'i^tDp\@4a$h\b&5Vg"Ldm,1Va`Yr_#QW?HM\j_ - CU1p5m277t'jfqP!O^D-jhqD'L(O[n]-LfLe/,j_PEsY^SjgHe/Pie7l]X#1d0Bd*aLfH\= - @Vn6iliG[;-uOqM[=gl+IGY/00DGAg"oC?P17./OXR/!lFK6(#\f-3UY`XX#UO - j=p\D`n[:[!Ctf`cHa/^:S!ClO4"B=h?N`&@1!9!Cs5IhKN\__AH3BE[j.&o*nnr'\R:dGt - b7SR]hBfXVXopi-Xbo[;Bt]o!(d2+3P+D#R_-(h1i-_M>DI,oS3BK4]N0^eo)h.4Lrp!qX)-U6md6)h93;TI,0>Nu*-Vm - T!QdG#H]lCF'AG"-6!R6!ED(]C0'DT:<([nFf^)9L#]?^;&7OB5uauca.h%h9]UqC183MT6H=ogcH6DS657 - ?K?kE>A2=2X$(mFaSUambl@aS>3[#(*+0m?SiuGHW+O4\pRuIRD;kT1:e&.gu"1:XSkX=2- - n:K_Kode+S8?3.6k)U-BI%li2LU^"9TX*r!?kMN@,M;XL47dje2u4;ZkB`2AoR(# - 6nm;=QID8eWI\4%<5I9JMs5>>SVkq!]@,Dm]L>qZCd`!DbEPO3%MY55*aVLAm9'#&^Xl@dmjo@gPu'.`uun$ZOY>m0R[3E_ - rti0VgEqXtpWZ.0T,nnAN'Q^b"uf1M0Vq_F"Z_)%E+,&Hr\t7hDo"&7Wfn:uN""$oIJmIdnKjd1$]j*>5U($?6P(EA1/X0,!ct&PY,Jk3R1YR2&;9[Na5%YRAJ@ud$h7OJ;4LDO\J,UE)aaKAiuK)d>9"6;((n_+1"@([cQ$Xh' - /A/J1!p?ukodD@91-6osCeU#6.Ac>\dN]4Ld$M]l.?Yi#&o(alFC8\J1=Fhedc+X)e6k$l - -P?k:`K`([o-70;,1@<3dg[jk:Fa5R.$G#nUK86%b:V0u>Z1STdY/$L5[SRX=VDqr0nP)+L - F6#,1,DQYnOkA6V),Gn%?gH#1?U$jfepX%1UD?HPC5;eJN/iV'_@G91=%rOKcnj*2[&G+1Q - +1JB-`YV3O>\G;lpfKUCQmn0f+eL;HGpn'0#H\2c8$c;+ipucRUfX4>JKL'?`/[a"NY24`d - Yde$q(fnNJY54;5@noB.Q$iBTeB5a.U#F8n@#k<1$84k!h+<$t"pi%Ym=<`:G$&?@q"#ZoJ - O?*kD5i\rL/X!m%I5r,2cPWqTJj$(np5*Rom`Ml9?77K&E6j8uCP.s8h>;M!A.^WP-'GWH( - 0N8a1/sJ"=;aX#BD(ekMl?%)=P;Z\;+$l"+6cCW67>4@`7QhHD8S.3OZ^idlV+XdW0p<2;A - Pl,8I7WuH9U!jp'Ji@7gC3_f/4@ZS1j)F_.o4[p$1unF&uSI2nJ`-g:"3HEEq<)3W?`,F7. - h]TFW38[-W3l%7'n$i2'4FBBi=So;NoX0PY4Z6hbGmb2jHR1Pqu#GLK&B5:R'U5oc7$i4&Z - l%7?nf%*jTlP8@r8\Y[VgKZUh,.6N;iaUIroh@cl?I>Dh - ebgW@,=WBY./!ro24k7W'b)kC?nr$/ibRo7f,BU.C9Q=FNmMa$j<@+FrnG&(ieX^j?+/XE"A'ttgaT.kAZAMZnoG.g - ]flYb-mGVlj8F_t*c_.=DT13J((ON1ukEC_qpB]h1KR:SOm@0)Vfl,>:A50)2fBh*4)pT7 - GEQlgf-O,b)0N1XA+o^d2-G%qO_)"EF;LWh2?e!mX*W8GB9W440VNabOa?S&GIP>!(MA+s_ - 0B&)/D"li':4,Kf2:+qH*^S!FEr;`fm\#pI^d!32t#uJZORa^2>@%W\,gL_>A=n)ep%>_GP - LIt]4\VEJf#_asR9i1U2JQ6 - !.X]pN>%tdt+%!W(+3,2mJ9(d - VVlp7"f=n,oTrjXL2i$h=f3g5TDAuN>)Hm;NkC-gK-S(.Qg:Wq)lYlmKXrb-OaEb4Y^cM]I - $1:$ORgWnAA/^" - &mk4DSS:?8'AHkaSBQ]o&DXXR&\rPG1>HI=18qr\;]A''A)oDj6b-g[XC.N9V#]%%V#'Sb? - #FhN0)l^PRgUl45R&42E47U"^\o]S%^UOB\qs'Nf&\o@91%_446;M/g?/5Jk&2`Om;->[>6cY]Y8Q^,tZ!(j - Eo';Q60D`a!r-8o)L1K>)#4NWp06&')>QJ\+%8OW2cb-f;L_HNLj\adfQH4J0_8X38gfbT+ - +9>IK;,Zc0RIb$<6[SC>VCfuk>Hc2>#U]]I?7GK_BYaEsK)>m;rrDIG3gXD%FOB?k?U\]'T - W\.7!8-mFr1V654e`uQ;/h'E-9/'%KcPC51%>h\edk%,pj!_>V\7WHpXkL<`jFH7pPgekDp - ("KWlebhne)q_jH'>rWZe=8nY43bhEF2Zm]f<>e)I58VGb2ci@_n8l_*LG8on?-&he#Uj%D - tVhTKTWpW34l_o]On.3He9>[V#1; - 'a5nnHgHPM@23Y'\^I_BO_]J(q[0i8"pVh54YpQsQp'B^GVd - bPl2^7jRo(%7^Zj1^r=*\kt_45E_?oDU2p>tedX0?p$/n6@<1*1QV.$fE*_i*SFp*dX.OJ& - XTDp>/s84`0q"8bh2([_.tc*gPU>7:NspnfG45SFsSq=kB6Hk8U\]r\NuWW\qN'V1+-KIu1 - mggN6]f^H\9q*tRSZ(2"k%r!N8Q*jPLLqnYIl]&%)orpfD@p"lDCbVMKAOB==\&IF.XiK2\ - o!X/i0!$C_jX:cs!MacZg"#P!@><"kZfpKX[8`5bWqA?AmV=qb8 - SJqj[GJB"ZHk-:RpD?)Dm\H"p_r8FnVOL'.C&d2ihM!g8?96]mDc8U`+$':*+\J!R']A!P\ - d4Kc\.50X]`=)^)`i2j6BXGQCCT(Y?WnCR1?i;_1_0N)bc:\EE:V$\!kOkl\3`C?#mC>pEH - f`b3F$EhQI$XiUM0jSmOFKd2IC5E"1A\?=!^hWKMf>.p'!;A9'CR4BgnL>.TdTG?NNs1FZ#N2Bj58" - *5t?=`Er)V`GZcGirPh'n_IL1Wp5Ek4Z]ahqNBkW - 30`5UgDNYRD_amjn!?VMa]hrgSY(Ih,3>+`j+;kff/GX(EG:#]*1\QF-9 - 2(!:s?*6a'UZ+$lOk9ti']>caL(]4'KcDo?KT`oE?DZ$0tMG4T'HEG/YQc;gNp3hYlm<'HSRFc*O%u]J`4VHq(?odYGo(D]fbP-&4IWo5] - \C5J,:Y;9qkF2C6PB_KA#lQerQM@"$VL&'9r%pDFbXCGUi!-8;W)\JYiMAlHor]X!ma)^?8ZN3P - u2[91lu+@K[Sd2!cCGiiO=HsgjY^,DjuUELk@=C[5'>-JRGb(iR#Ff5['Zk2DQu4;+_*].! - 3e0%9djM\k+sGlAq=^MN,umPe(>;'9j*'N7,hK7H/-_QBS%j:+C*RkcHS6e&Is.)#i$a8l2 - EaP^g35%bOY*S5B<.0 - sGg./]-5=-6V:-3fXa)QVlb+:5eMSpTL%AS\EBp]AR\*T,$X[CtLp.WVUITXpA#m!mNckW6 - d!I3>.j=>e(1O;aC-uX0`(70JQ>tTbcV`S"T/8<<\6:c;CS(d7J9.[qgIgQmW7@e6eILEdM - ,@O>l%?>:$Ah8U'iXMte#[VJXiQs59Iba^Q'WtPg;O4Yltj):pM.rR$d![41-d)RIN@4%_0 - 0a&d6CHUR`^@Uj0*jY\MrA#P)Ie=B`'BpYNl'lLq%MEH-O')pA/0bI=\N=Do('Ms'I`5J7. - 49]snj=7D'ps?To7>f>@YY.=Hsph@-V[1D!pZfmrJn/ZcGQ(#f'fJ?'_/]Jscsik,4PE1T; - 1\Ea"Ekt-j'Xpi2c$Q$?I+E$_P1rpO^&`2lDNUhLDa:4U9@U#OYZJJ?spb+&T/@euk-3q]c - h[=!HE=]@@*6gK0[c;a@QZITFb;XIeB:OU1Z:s2.BbT"fsuE8h.V5/Uiqd!g3O]Ql1]D4HQ_-J1mIS"LpAE(G'/N9d9>.i - 0L;R.-;/hKqPiZdLZs0.Pk2%?#2AVA1r,WKjN^$V?Y%?Mg52k^3:Qi35/_Sn]#P/88\9HOK - XLlrMnZE'1=NW]HljlL2mumjNLp,55'aa - A]13:6X'^S\couNCW]E?-k-LIFinNW1InMc8tUh0jV%FpSr_f/+W\F.;QX=0'gilA9-]V/& - A%-(NoMUS^dWD`cj5dT6V3?nJmdJps`a8.&TFn?=8EZ%lAS0nX\e`?WQSm`Tb`.T(P8b0^D - ?1kBrudp+lVkm,$4YqObKp=pLdK^ZYIN^s^OuF#Qg9^IcJCYBe2OR&\3;Y3n?nIlr)-t - pO&+WshhQGo.rV/c(9,kC^[kM+XiiXnjjQ;@Yja6*r&"U`rd9D](2)7s(_ZI9.K9_8?s9^(GA%PU/[*+i>266S!W'3R&242iBdQ0/P - ^Vkc)FUS&<0%6?G<,A2>1K4eHOS_IPPT"?Ss1Xgl#)NPmtJ#dhLTYJa=8ZReX4gd=I,/?8> - '3UB4lgd4Au0LZC.S.&1W'9>P'9Z88A6I\Q:\g,//eO$oH`@O8A9N\l:6:J7=7I3C\`$WGr - 42lkX`\]3c#k#VF,K6`k7<7ree2Y>8#=`Ms`Om<_`,(^7:+I"h(Q#l5]M:jen4*R\]0%*'" - BVUVF%9b]UI9)iUiJ<)H+r"aLbs?Em!2*2:I#U'8&DFKj8d!F$G[@*VVH^:g=&2!#,C73+i - I58<"M=uI]Z;!+hWUglY&hZJ]Ook)15aK,Rqgt^f_1\&Ag8mjsLV@ - ""2T2!'6pJ^iA[YQe8"j51S;YLjSk!UhO9D5M["KpIH:N(Pa^f6\KW'lXKIN^e87W>IS>7= - 0V*AJ"9!jaRI#l;nU+'oR/_mHpKX%sZS'#QRb6`^Aj)VsuMFW''Q`R^+>Ra31]uNf[92f]+ - P`ADe3W]#1(+oc5^` - FS?jOG#>5a@9`&d*eI#$@qFFeATfM` - Q/&RceQRhr@6*p-5Aqnc(oqi9X%5#!6lM,:aFCX<7*u`/l>mub[f>Ibi;C9/3fCbb5Bpeb- - =hZ5uY`:dQL%K4&s],(t>BS_t_b]^uX"h,LkCoe==c*C%2tH9TXBlQ&SSa78VL]GZ?%g',3 - i5bRE$-#$#'S[ImKpAQ9eb;Ur0Veb*/_,a5WufsZTA2H;M1oiW?L@b*\PecB/I'kZ!cCK<; - sdpYu%NFc-:C0$H3ep1WEF]R(_DH1sA/JmN - I7CmaeTF_jX8(N4qpJ+rc6h/86gq:g&Zbfn1HPbY,Kf\@U-/fgCue"ea8:j]T3[fu - oO]7@2^#O'2W4=dp_k;`?n(V:n"r=S8W2CP>reT0s@>fs@O/eYtu;PHFr'\bi4+P\E7.*SU - Ik>7HMFKsfUnUK]g<>Et12e[F/-Q)ec7>:k`f"\N!AZrm:7=UWZGjcqi#Qidon'F=uF`5Q.B3re6O*60o_XU - _kPkUb?_Nmg)\l#c,*Y4hH;_E?-Abp'qnk&ADFoq807pgO79._45>qA5m%,]#]hpF8fN7(VkqH - 4OfdY,_M,EgLb$"+c/cs?]JHIU:>A?Af6ODDAaSAn3kE_l%Xe89plSMX$S&(XDj8JOeG*CS - ipio*?>;u@>-h'CmC)q6*6hrNPNVA3G8X5T?a?Z#Do"\W2spg:`W=C!.YWJP!kktCF/k9Mr,[nrI94eYJ:24=JB]T.Si\jjbefj'Z&7M/Ik$) - Z\jR$MB;-/G^AWCeCr^c+a?rSu6B!+nl`8G8?kN'l#kE])[L43]GIq;)jkR#4A*A(o9.Oeg - "BM?BY?9RLiJRt-RjeadX;5WJF@FDlK2D,0q:1%TcM3P_1Bb$']:6HbP!Tni?Am?+BhJ(CR - Lm3C*ICeC>O+2O[09JFm\]8<<=M-uf+hIip7mg8Z3lo+lN - MRaf"#SQ\ngtQ` - +h*@AZG`ia%4DHKrceE)5251,Mldd&=K=2qW7(-pJHV-#Y27^fQn22$i&hH56a7]+jTk/(p - %[mNXFC_j,?Jjj!eNa0Qo>Q*gC)gU<]Zt'k2"Rb?A6MSFjo16T3Po,?'a_\ - F-k^;pKbf3>_Ueu?(kHpi,?@*Dp>1tmf$Q&U@95jm_8I$*M;$@Y4)r)DOo;2X=ituqd)br> - aFe`rsE)1"Rcffh_!FKjc/]3$uhgME.71n]u+gh!AgVB7@!3/?KgpD)A)>r7f>J0%ih?S6u - f87b%D]&[?R_`dgMcie#%Fr6='-?P\m[:bbbPIpp#ig"32qnAQ#/V%k2Me,3'Ii@S5rlD_5 - faP/uFs@XdAIKDFhA']\j?o04Yo?J:]WBCbdUg/?gJl21&;g0lo\*EO:.mal'geoSk_o*7D - B`adBeYk(-=2MmiA[WOn$j)]u,Eh=\T#=[eD+`k[YlTI<$-Ur4>Mf)lS8bXJ$pI=\F8lL;7g\i3l<+'3W(!S`qop:]j":N5/tEH$,H?@1p\T+ - ^kb[.-A-FcS'I:O`"%=Ecu4G)lNFQ$J9qnjES*:R`1V(;PS - 8oF5)s36CsERsI;d+'dfHpR6DHSp;uJiJ41S$4<.TVe8C*qOa%I&$C5k(])8XqVR/jO.,oH - YU9P@G^$X37n@aB)tc^kVT1Re2^`VNT;qXu$^W(ca-3Fl.e3/*nisr>7n`a*9_3J?-J-"S` - ;][Q^3G-';c/TFXg\:rH5n`E*,4L(Cc/<6LOGi9aY/_a()B`gR_I[Qc7@Q)4 - [4\-&fUjZMH].h_h=OC2,b'2NM.Be*Jkn*8G;8\".=)3a7Vc+W&Jl[lF?;^NhouB=GDM'rq - ;Q_t!?r9^b`kcg#U2HqcOIX..Z$]03P7aZm1(cZ;8lJ"Kn_tOI,c5WGtXV'lFs/*(PZB%GYl;])p;P]Q<8VrZck - "7::aXSg(\q66C;KHPTkDS"4FqI:dJZhrEFV0!Za6..8ojRkGAC(2sn:";)&b_f[gJl7g(__.k[4,Z$Pa>`0YJm`g9#DQ[I - 2@Q3d(fg@i@K6TgL>uC%-D"\Lp-i'C38Pm?j7rgV/`^uJ++e%UmST4F=Ul+2dogP9]H1$'GAU2"TQRLPI(OtZ6mZX=+qAu2okh:nBpcj&DX/Fq0Q5crAEF)eEdb#&[Z0 - [:3obD52?;HSuRqa+Um.aWCZ#4fHm"k*L7[:[J]+1OLU&5D"#O\)Lq3ga_F=hq,gh.YEi4P - +.c1@:)AA'Jd$Ge;>.QjubFPQ/&Joh[[o![=:.[*$hEn=5\C`T?3?7Q/G[@'#cdG$FK'KsE`L(Li_2._5Nm3u!.OBb5MJKM\a9k]>,UF%q'!`oTff_kQSFr[uNge,TF%U - /iR=J*4A%apQ3g0m0`k$(NcO$)?:kj!ifaC6@NCe*>DI0KgXZ>[c+e,@gWQ?%6-Rc& - (He".U:MIdPl\+2qPNJbkaPSin`Ec6f60so;mhonXHAh6`YZ@e(!b_1DU/d`1]?3?Hjc'hV - ;9k$ManJ>:FG"J;[Z3c!$UQ;]+G0:oCe78i-(_1,Q0.Z3?Djockg?ae+5uN)%NZhO9g!;]dpVi:KegnP$6N]o]98DE<=3WQ@/m6EeNoM1,_ - 3Dhm;`STbZZR2$=)198*+,Drr[P&$L7i56'/oC#$bdHr)V,4AVD1h%e60/tjB62q(N'>q=H - ?M$MbgEc5-qRVf&=*^UTSVP_908l05)A#Y]GhrZ#p[-BUhekoB*2bHJ^h\$C.tR-25k,ref - POSMKFE)r#Y1DVBt`R'tI,c+?&'mX9k]GD>X"R3!-/phL//b[m)EV>*Cemipa,qI;TYK5X3 - 49K2lcFV(Fka;CgN2;\^l0["lP*Zn*!926n*!u>WW/S-XhrSH=a%Ih&61GQ>1jH8&R6M__C - [I4Z&I't#/aYBp.U>Y0s]:2Zh@b>,@4*_`a^$nKU"%sl5],XUEFBP*>*=[\*YXTJ.^'DD3Y - 6a)m:(qTd8^KN:2WSnFXm_dJ^@a]-kWNj3E$!?UqbJDX]M#Et:>a\_Q[/$mh]!NsS_s5RJ8 - gL&nkR_N4`Wc=nPsG>pfu!*Rg4f>5#3E5f,nP/Ef+L9;oSQ60B!pX0!*nM[<^Y(kWJB$\To - *Cq&`Dn]XoP%fg!^4^L?H^^PHR4&(5a\>i^,MneSl>6,O/L.8O6$*YfD#$S - r;Yg4n"mC+9?aqB7*j2<9I7"9n&12SVZB!0/_>hJZRo" - qLh)*;YaX.n)-L&46&N\4agj"O#s'V],^`dflq`b4%O:cqaTP(BO#J#&fD)n0nX)KViYt>f - KbF$HW;470W1G!0Dg.OG5jA&6@Lt#7`H9C1H35O@\<6rso\C5j'L+OC2E"7h#\=BFsB=X-jO - h(i.MB&n[ICYeq"a,!Vj='.+A+OQR3&D%'8j%*'q.EBb%Sf+iou%aeoEnZ%qbCrciXdJ_J_i69^t%V;3;mh*tT#Q)N`hiYn7bVnIs;[*g,8!EQ'$iq\ - [^$'%.(-&BQ"L"!;OK+`ZroZ2kB:Nu/J:+481T1(`o;0d-"p3H:r?nOX,YPX+bc)of9'&VD - <)d3N``hJth%dK_";5_lXX,#W2&1$9j'CF&ET,Z0C4EN^drN=4"f<=Hm]X_Q1V\gkmnXm"d - cN#*&)_^]1\_X-G9"N)`_m44?b$HhB[&617/R*B0*/Bd8/P1(s[Y4C#>__;;Gc-T`OQS!7D - /YlZ(nrkW/GchL^0%0bL;Y)Cp#+SS\/h"aEZB$`H*(_C9iFlPR%JqkX8q?>&11tua;_9+b? - AK7OJb#nF9,`)>5V*=P/+ZCj1FXnRa#.p5jKhc9kfks51GohO0FZPk1Gq(2n>'!.26u$pK2 - FC&JhJo12,fDkdoe[E3B9fZ39X!q1MJm+D`[Kh2tO.3Z_ohTX#G+'2m^1Z8$=sDd5s-+4Yt - Um/=SR'8NRRR2M0f#r\])l%f'ne)\BQ!q*D@2`(J!e(fX6#=2; - [5R0o;1M&lcpiSD45nkD#F;+.d27Af00FI>^tatIX+Nol(N%I69cb;4$A0dk+2F - ;IR8gk[eIjAVaFcBNk?\9h2q1C/A]dipH-)`X$,lu%)C[*^u-eDBiN34.KtZ@+\;I8:)>:5 - >MnFDU8>'(pLrad;Pn-YiX&2k>GpsNFe?r3H(5?oXiRFbr9u0d#rCc - `H9Jnt#[6[FmChQa8/HB[o1G'egc - P04G2)lp?YUMI.?R4lAE][IS4=4)=NHP>2Fn9%?].Ohk? - "X%Bp!m7:S::jX.(.MZ=>Q8e2.]Wc@9tHY'5TnQ$6rLR9Wa?A6+=^F[K-84%tPfr>&TlQ('Sn`G%2`B5Hl(1ub - !)[ki]t>S^1Ha*M;47V*!b5aK!jm^0egi656`=LRE<.$\/:-!]bC-8r%uB`2lR6Fca>;H4* - CMU-7ZCMu*NmLJE"[Pr+,).6CNea\"1mn=N.J+q!'<$d"%),DI$EYs"R<[1YtUI82HE/?N3'[M^TWDb`'I_tQ#=$:U= - $\@K^i"ui5fH#HdXHU)8JX?FgP3\)d@>FVB8/GOjfOn<-nO5>>KNSVB3*0duO%AU>LY-[*F - 4=EH?'<)qP6K6/nGQh+KiD,FJlc&TAa!4HN[D]&LDP#DUt:j,O-S@WO]Rrr"CI?h++0eAPp - baSQd\1EZO%QedSO+%"X6Q5NDEWG@A/O,UqOQGX<%;tQ"!7q-4=IT\Ip6lD$:$YW - \8KHcnS6P#AZ[ss`_J&2+`K^Y92o70kNT3'E@2elAR\X>J5oTpk"oc'DG\QDhb3sO9@I.,U# - [r`oW'JR+*L"^'MopohRSkkeFV4(&8F:^NjUQTmC,5G"p/1$U@kqOS71WRt2MqsG;6)]*JN - 0Yo=\!-9AFi.EafALaSSU`]d4h6QEqR';SMhi;'Wd8HZ3BHOG_2 - 2@=O'*omRL"'TPuTe,TGB2SVi.Gk1U&oEB=c'cmqJ^;23B:%Z'JOf=ETQ`\Z4iIZ.`isENQ - #Pi*:F$+e3R"JmXDdJo5H+98C@LZU)6)-"8WL2/9qY4I*gc-)jOr:Z - 8N@%#P"PYkp[u7gM4)?C!S%.K]I_1i9lLV(d]5Z?eOZL?7gT=m'%rpu63X6%rg:t-Ck_iR! - ;\Ge3)[fdn)jE5?AGFKaHc`$!W8%))\u/c><5Z,26,-XYYRXCBe:E`>rO"+\Zu3^eZ4jV)a - 0lG<[]!3E<` - NV\ael\l_cPfVS86*B/]IX/``F\.*'(3KT5#;C\b?P[>FW6.O2r7.^",hi)9'_k4heBcb'A - ice$ZjoH*@+=aHhCopts6lUL]lm-G.aCOut:c5Wq1<[TqG!4O(Wg'9X:XaP3X[I,D7HEG5: - Ac%YQ%r)(P)q9TVbM7cS:>]k8Gn7*G2_S%5O0F_X,,ET?XOSH^G7@]UrOS]s*Vn8R]=\kC> - 4_:*]e(Q[kD'HHuY2'g%a2mGKI7BXT*GbUaWGNg,bJ5Q-gTA)%DSlA&m&PUmdtC(2])s!(R - qG([\\#P%NdNo`(_ATMT7Lb3cpp6q]'nAMA43n@f4X'1\5g4jZq$PCc5jUIq#fD6\]A"3h, - tWNgKL0M8tJ3!8UVuDI9F:;U"MT(Yo%8SRpF]p_,8o2g3+LKgR[7>]p)fCKJ$-;rXIfB+5o - ?T\%#pBR`VM[or\3D9FQ2KI9GTShrC:kf^k*\r_KYe9sWVWindPoghk.2X5VoJY$-&'MKR[ - V=6)86kB7m'g\0a>!MWX]kIg3?4sAj5H+2XsfUeRX44WS%JA(p)h7%T5rS^M#"f$MAloPnS - em0-I"F\`hm'-rbr/P_/kNq%M-PYJ*:grLu#)!W`7pbTM*p-($p$OQYEBa=$IeW6,mjd2oj - #`UrYoE3rc:.Nm+Tu*h=Vot:%k^Us>l("RlRI:%?o*r5c,EV5qerkDJ - ,+-6Cc\0)=W'FkBKJj82?GW[;d$@tQQnE?*3.2@b0it7[.DE/_u8)t:#'TPa2P=_J[Ln$4F - 'UDAMEdZPeMPLQI+jf$<8R04IeiSZtWMmWBm?..Weh[hPXAW8 - h0Juc!goHVq:;K3fM)!@^=T:eshn1f2B-1Cc?.#mQ#F!hC[?KrSI@(Xjf%+r)HB+Ku[CP[O - ]'6+c47s16W+LlReOJjn%.V7W001cePlfbpD[5OjiGJ[`e?Paem\Ap3,5_G@S,>Dtk:n(Cl - 9]K0qWh^]uBR#ibFE3kcT"M9"Xt]+V9%CRa)@FE!d2#?Q'(n+Smak`9XnihcH7*8a8]U$DI - NIFJd_?gHnH4` - p;b0rjWbR&@oF%0X7=NO93A1fRH[5>ecS%kpbcN#:8+X:i!1/G.(9Thr')4\O%AdX.e?*Q7- - &]/aIQ`l_*]N<$Sa9r1tce7pO'&jR[afoiVY`U1og*A8q - ta5)f/ch`Xq>=Kfb(m7fb\Qg\ka(U5pm - ';&7fEaJ^2nG=u$H/HQt(ZT3eT?l1%53D^2SEbK;Y(:@R#P.^(_mW7Z=jX\]QNCDk'7ucN0Ak![T>V9_^D/Z;IIi,e%\HCNSn>? - Q'&nG5KAlCSgq%4Yml].7tDT.'YB>WH)JY!5r,2\5!m\L<6@YnfZg`DKLo'X9PII3V'OKKO - O?qKl$j]/d`up=8op4DCCd-bjGRf^6GH[^3_bk1Rr@]r2V?5GB8X]m;T_U!WG_MVo\tubee - u[72lS$ - `NcFe(P.MDJdeMK(SW>QLn6oXhCr,?h)eb`.P9%r29tJTb-5Gq,s%n;0V.&LZOSWoZ&H,/';I(iFsc;^P0L_df(U+(Xn@RUFG? - 4A#pcicmE)_YEfn\'4[Im]p0F!l@6EjE88\m6_Y?Zl>.U8YE90^%LgoCNF:WD'*J(\E[hfn - YH[fs.'7$s.leVHFUs`!fV7M]V&Fo2.6,C=0R%?IJ^NDmBZSU6n;@dVQ+HnP4kZpqKaBF$GV"KW - $#^Fkfl"MiLg!:mH@Dbhh/W'f"R@dKhcF_7ar7E`Dt^3X[0H]FcL]gq(\?M)eq6Q]njA?I% - 5V-9L#)RP/t9cl6=#=1et?CINd*Vi!WM649.KNd,Eis$BR6lP9/"R(n![5%n(dV6iYi>[*s - AB^'NKGO?Bt]%9j6P]MX=G5pH)+'@)gJTLSikLCPRM\_j`EVIc`\^tJMD+\HZo`#HL>\YbG - aYgLa%F0X[6L&D,MmI\A-bVHGQssrEG31Z+XHd^bn@j(Tme7d`[?l-`*HTKOELnN1[P(WuD - 47MkKAQ.hcHs5m+87A"OIAo@0ckV5EW1%;RWBD#GnmIW04'2(O,%n]#DFu.,1bN#K^#X*KC - s_4^O32b2pP9qpqMINMoqUN,2#cbjY#%$bJ_U%H#)Oa5NZf%^st(cd;h`e1\_O)FSES_7E\6"sm*&mA-8_N7hO--r$'T`U:(b(IenGYoc - qB#+o\\()3-3'=rX[(@MaI/o8D$rDY^<1s4'EL6uDR1b"^cV,u'Es=U!]i*b1.jS_MOlOR$ - +f/5^p7;cC^iN%Ohg2d5\pM;HFk^I0YR7<5qq7_WO"(b*2EBf_/QD?J?V<7Xt_(T10b9F,T - R?sVDMN5^0D7"ll_;s+c-SJ[gX/f,6YU-+[:ll3pUlOoGYT9l3lAoMc;5]1]JjrYmEfZD%6+n_K7WGZo,5^&d\t*NUr+F!llk!/jKEW6b&2nOe=tN4[*[H#fJtmF@@e2-_;8 - S]E0au6pn]AogEeHP"\E`S+F=V6:A);`5*n9Mn[-ofpe4&,a6G+`(H%X:RdM-+EUSc@YbRP - WTi%Y"$L!84o>a`#,q!LC%4A7Je&br/-@N+Z\nJ][LuCW1HQGU;d - <-aU;C\E^$rX>fbEW$.DbXKS_tc:q%.!8UQg^qCY>X50--^8Fs>#UNaiM_acP;2l(=QN.X^ - gPR>kFa-;1tjJ'`.VnPQq8s$R)9&N6E%krs=b+,>"Mh)Uh4j#%Ob+fHg0m'b'X\*9&92'o[ - N4Ba(Y=c`gb6uE_A=#BJS![0f`KZHF\_Ga)m52>bF2q^!'H;b - S)d+C?\9*Qc\mD8X,Ob%%BiLccOD6Vu3aA4Ni[g_ap8s9.[PGN7,kL9M2sb9+94*1buY3[? - _eg:!B`^6Nt`AZV.sG5AZl`,i;>7cH87ob-^76+ER=Y! - :IQ$k%&hP/)Gj,jc^aUSXV]BDmnrDfcNN9&<2.]M*#>X!9t_^fCqr(O_9QTUdUVo),ecpV= - Ij3u9_Ba\7'+V_&[%ZU8nBH;ii1-j/PEb&Q'Cl<2()9b1f8*F:+Y'rbr3t2UVr]Nb_+PCK* - fb,aO3a7ZqIpXjZuP8Y*UEkc=k0bSDhbQ511/tdT!.\"\-oH4k*BVde))=>piMr+&qRC6u< - R`$^&Bh##Tdh\d?hrk#8-a.6[??"h^kCf[4lf!T3@m;11(E)u(7epV;agFH(M - Dc\6-<:tK(A,W2PdC3(d_-M9*dI=MH82$2+`IqqG>3"$^.32SPR8\)9kn6o4j&b:M)B(]!< - $^+-IFk+DmND4^9E>T-0,kQkcGWU[Y!PHJ1 - f7VY(*mlV+m,Y-8)2>)dRS?&mRFO0'_(gI6MANO^?VN7tC_PuY0E*-"t)'\RQ.\dc<>SP*0 - e^=os;[bZJf*72=2P;eI,m7KmZhsA"rAG>K)G'L#PU-khZKDh - G([f%:N+.k?@Q;>6PDP`Hg=BZX/@P=_1'-28?a,l\W$cgR[sZXh(i]i7ne58'>CDS\H8Wgt - 5W]?HCm(29+E6`8"(??N?g*XjC=lXBhYNa=YS?aWB5kSP5UWeD8eTAYWD9jBqRCfq]0fUG-$J)r:1i=oK> - 34i(KXZ/2>N?@Ei#]WpB)&`GMd@HJk/e\^,OTO2jjhbG_(P*=WI+CX+Pc:'&:%Or$U.pCL/ - b4[QT[PHfA#grnPRoPR*NQpKCb$6h6gjRE,Q3U\:0jl%=X0pPemPJ3"YHA?qj5pJ99=ELh4 - kDQ[ic..j%R]<#*9(shg(iHu*ZS@#ZJl2Dg0RM4SkBBM27ME(@K&?!oQ&s*),Op?iq=O&IL - ;&tp"DRsir'odU[)D]OQFHgim(q@>7]_2=5n[9>DpsAh>uN9XOTdG;'oUS7TeI]<8sK6>Ac - Sq/GA,k[btISi,3C:R)iZq3+59Jk'h)(("6d^/*>\Vh-A$3"qfPMADtnKAe7;pQ5%n[S2SY$C'JKe# - &7k,DI;Nji2+EXD@GT._;l(T>\9L=L"#4N2@Y$Xc_b14NcSjY;s3"h*hIao*9?4IQ/tbpl# - it0&Q!-^HYIAMBPf\>7M"_VM.QP*CXr.B`eicR[:iUTCPKT2NbE$-[-PHBksia0c=,_p[qn - 7KCeeO-=f's*_/.$?Al5Smen41nA)haA=GCbTA/=F4>!YUd)r:d0AoQPfW>jW%?oCDhSugW - UFibE9lAd3.IM8Alhs4T=lNqrH/p$>1T',5cmCqCo2G32?h/)H:CaN"sU>Tpsjm2o$l"5k9 - 4Fh=h=)S<.mhV*f^>SC?ID - 'h(11]%c.=32Q0C&I,=aC;n+mI^QC;D$MXYpCEroZe(@gkEilA*dF%7rkri>&kmdN8_o8^7 - tcTPiWeag1'o0*4s``?_pfGu%]X>`B1]h!5l'(e+NP".(mT,(OGH?+4"oFFIESj?I^#k:'B - FS>r@hbDF@(\&6hFU(KTAq718LNQ)unJcC]mM5AjPB$CcoSph1gR-P^9(_R:m70#+:GQs/? - ZWN[oG7E!*piO.2tY-ZE+[40T4W$9B6%&=o47fAG@pP5"^Y4#me:F=05>[nBD23gBieX606 - ,W/A7`ogfe5QFLI?:piV,8opV!QWFF2jO;&nbGE$Sicg"BSPghcW'7.5[TkCQnk.C=tM\_c - T`-\V/Xr:k`I_G>tjs+\`[RZ%l\qJO/@%r_a=iSCp.#f%qoh% - p%h7BHG+e(#CLk<_qXP;mWdT1??&r@TG=EFGQ3lg>`FQlTi4/G+SSteX4^hIAT`A+kp0u,k4J:9 - ?Pr^$[RC%V5!i^`IQIY$lXMELm9k!eJ!`4;RjdTq=bk+RRAIf`jS'%m4.W;_#4`;f>V6K8# - Xq#$uu71]%jP7rGDr;X%hL]dPT!.dAmYUCb,&IX:YU!WRf7O8_*7:OYH<"^&QN5m0)R0594 - #Ed);12-<;<=Ol0A^^C-5!'^H6=]Ss/>dJ9RS;n.ac-LY6^^ZHZZt"!9hCmBi3]Jc7\N5M< - FYRb2(#Y&Pt<4Ig>ue?>cV"Dd-DE%HXWGrX:pJV,0=K/<@p#,h88&eVGo'H3pkN&6+boj-ce.2HM&kc=_4OrDAG2Je8iS(jtD/Wcie)9*[S_c;O-fLi - D,$qH:PMu"dom&_RcbGJ0d87'FL'ggLl%&PJN,^aVZ,rAnqGAAL`q"(LRbY/EmPa/nWW" - [.\.F!A9%jGpR]d>W\S]rrB+'1t%8\Lu(RqM-098h'sU%)<"i`Q\KAM%r^*!imcm$:N,rZ" - e[P(Ud.^i4D?sUrbL>ck=_h5u['*3CL+"1HNc;,&\[NF@-@!dW0aV2F'fKIdL&*U0g>5c(- - XPb7sV7ZW'aH#shGW`;&Inoh)D\4`.$$9i_ah3p9V/XD6P0CILlC;=GT'?`6m<@YRf<)Jqd - n&VXk/791+eK\?$GnP*2+rN/oL1'Ibsf2h7m@*f\s.4!7SCsQ2:=.KdF?'c:;CYZCYcXU20 - N;%)DpN1\*=qG8+J5LP+fi?Vp/br=S(ffsMbG8P`;b6]'2'1e@k!(HUP[+ZQ:b"8"?HY6Bc - ]GAUF=i\eXH`)/f=214QULXm@2hp$R^.`\lB+Ef>\X% - DqF\YEa/[7@:^Ra'Ti-sH6PSnn[uP?d*MAUOjO)Eub&j-t/tU#+F2.Cm/SO$))]4hq,5?#=Elon4i??K=Vl2(Fu;=Zc&Ju]pHrDHH,j>DOLn.F,s? - uJW]^a"lrTDSnDn(Dlk\0P7NUI9^\@Lk4a3nW@q*H!QZb!*g`!hDtqIugSK^]q`^*/j!0CQ - ]Aq\7FjZo9+jr-1APqgA,#B5"X-&mmJKfVZ;!3^e.r@Gs - BSH:2*c>q`Ct-UjCe)WP@FDNKEl^_],l=%b'$.fM01BCPfI3q[hS[QMJfb\e8nG?WE!-,N" - pa^Dc!C5nX67lVi[+(Q.L$T^^A3)(],1ma@Up.\+LOVjaE,%>Ra&Y?O'"5F6=KlSTr[g>&D - +N.EAY`4;hq#)\pCcWb\h3/L.:;nBpQC#k%)9[kiMilN.PHu;c9U-g\QAg9P:r6m9W*(,U3 - Y[N-"`_::\FPW*hfLTa9=Y?5[q6o;Ojh$h:DoWHj3t\hdgg.fpld..h!9Sgl'tM*prqmS^6 - #\@:I1sW+W%57MGt$G8Wrj<-0#c717h<>3*enH`=S4EDIubW&O.6U"dLc"7m`KH9VH"5>&[ - L^b>k#kjp^%8bGprG<^Y-##n\?GoU^$9>#V:>i>n,hVXaXD7ChcUkJYW9dt0P - X\Fs^$Cf$rbH;DT'gHMO#AZXDDH9fWj="-7TX7#pXdn7RqlZE93#D.Y,PLVt^K1J%_.Z?:] - ].Dj9(TEA@rB6T/XXl=VUb\sG=BYoWX?/_6<OBV=S;.lbggn62BU - !.j[9D>9HaS%`c)IR_9\ruW]j6tIc@7B?jk`N?5AkeWTsTj)5g"jpDfmJ3[!B`"6CdGGQ,( - -Hb.UpSm5rj&8VhTUbLmcDgl2?RrImQX]rjl]Dp!V?3p/_\Lq*f7l$Z)SqgK-S#>kN\9Hgajs*- - hJ0#I/[dZe21k=.UtGMrb2Kpqq5mu7@sN'jqLF^G+D+3QF`I+a`EB5Di;'uY1,a*63$C<79 - Ga.s/o2[$DTku5.8KB>\^0i)(u<_rC8p>;MYP(>--URNna;1\(Gcrcb'OfkVEh]&Q#83Hl$ - 2joRAbBA.V_Y:VtAP=db:]YjnmcRZK@:kqVPNs=Jn3_IZN%tO#KL$C8U#\^WlW[r9#WKRPV - +f^^Njlk=oHP/eRlm>9bP/CeK;$IMoh'0n&2$!MXQT8'L]S%VUi!#^Jh,gSO9s^77G>W(/j1V/J]NG'Qb#XN-%cC=(i;2&V,rq)gijS[(]2'j"*\!q.)E"Pd - mrNKL*4e+a\`DP;l/GE_4nELHh.[pPbR3Ns2ZD-d>0]TSN;'ZJ(1s"^cXZSV\$S(904\9cF - E)2@/N2-pg>*P>B+IGD_>?dWeQLq%Z',KPU>JbA\XQK@t)sM]H^GZg^m5Fit\Z - S@-3-;aoR[8`Oq5(-n*9Zc19=`,*HcNGZ60(&00ISI#auj3Z3YFq&KEQX;5nrgT - 3]?U*]/#LE$#RpRis8E>2>'C=S0duqBYglf"gm9a(3r@`rP\`;:aD]dagX:Gh3WW0/qr+C!6'K:,\NN^?n8*!Y[1%]"si2QX(Er-n9bq`Xo - n__+V*<.1cHQR_0?AH^8YIVo(n'\l:Ep-92rD-0^M&Pt].^(?*pF`3A%qMpV(;B5I^2BnE0 - 866?.lE@eQ:N!,7JH?>\2%:CP&"Ae*`PpBAj`r3 - ,>[a.2*a!7e-erigeB&,QTIcLFZtr\0ZFK0KN7q#'RfqX=^ADtNR*eeiF@5ln1:&:b;B - [Ygi-=\Oqnl"="(GIdYM3#;;\AODbKp`qaO4q!b$jU^[Y"Ka4g"fFM$a0/!PARhZN5NUOsg - 0aQ_Km,JYUnL]XfOZG^bW9;0k!%kMbn-I`%o&ju6%<1bHmqUTRi;l_g%FD]qVT?%TD%Y,K[ - #N#[:cQ!7h@6n)j#U_0NT5JpC_D.#k9%q%cn[Mh#_06%rP#\.@h3Y2\ - kh,;,Z$%\tt>>2D#K*iWu4n\FBc?O-,Zhm!m - EOjN!'o&=WnlZ,9>;>2LLk6Am)*g2R(P(r(\g?$Ym#>uER&[_a\UsMu",L>#cE[r:gcRf5C - j\j*KDo2G`@-1lX3,VaoN&PFEJ?OIKD$W9V8n/3Q.D - U6\k#%]4K%eT'bgCFqg%o!gNMu^c\gF9;=+`fcbdm5AmPpu(NmE.9iZDfZ8RbfhonoJ(nmb - 9ENh(0-K1i\9('6,->\IDI4#qt*d1Q+6>p@;hL84]2R!e>-m@2*LiG"X5/U-gu"p94(#/ui - JDF.54b(HUY<4#85f-J#u]_CtMJ.W_3nd&+^%]/d`p4_ju$;]RntPrf%95',[FOD-i+krS* - u,STo8PC>\H$TfV#,kMC*F5&q(#%WqE2=q)(PKlFuh^^(p42e47<%C8?+">+?IT-qKPSZ^. - s"3UQ)l31!oG']E]02BE1fHD'PU%Uj)*:`K6Sm[]F@eYQ;)^;RlguDh@_k+TMQW165f9-Y' - R<'1HoKP>75KusNuBm.TOe3X3:sUOK"dUblOI`R9,,E>@rk;Masltt9[ikSoYruBcV>2*/] - 1F\.=4e]a\K56.CAP<'UFaB#>HG4:K73d<<5k#_bJYF:ph*9PljYO)c7=<:R)/_PjqLK,>h - Gg;3`Y/eA2t2,u@T/;cOc8PmpTJ4%f/l;q4H#_h-1soJ!1Jq/M=`p]@oX.IDXM7HD1JFuN[DuQqo1h1I< - XrPGeWEoK&PmQ8=O`%3eg4c@"(KgV16m&]eh9\)'hsbN>udY%Fq\DO:AAu%>*_Sa4aZU- - D;[j4lV8'de\I[U`GKKk - D)W2O2LTGNj\OGrFE\1:1mrI[3G]IXC[JlXG@r6;lpV^H4k=Igf4Aca;0OsI!qg8K(PQp3J - TnRb@[E3o=,hEI]lY']EjqrmQ`GGaYBq(lHWR\'Qb.Ur^O-j8Hrn@9L^\N\D1(AZI4'o!Y8 - r%$7t'DdINq4/@mPRQjaF%HIj^gtVMfq:?%8_qJ*/J8-b4c:rIF%ZJ7G4#j#qsg4+ZEPJg3 - 4+@j-H6-%T\DK-Q5)is143"bYh#KHfZ6@aB_;7>#g;JN*7UGPGoT>C[PsA/J6n(hnD#Cc%M - TI(4BUR!XV@Iu"qoLffFgR#?dQO,4^;M--+$R%&rbT8FJ\MHHd6R&c+sYDX7(McdHHR(J:/ - ^Pj#IN*+,ZR*1H@c]&djNEFelR+mVQhi8Q6N`bJ)R-TdbmuJ=WO').;R/;rss,\*#OBDgMR - 1#,0&!7_CO]`K_R2_:A+-IKdP$'/qR4FHR09[80P?Bi.R6-Vc5Em$QPZ^M@R7idt:R)erQ! - %1RR9Ps0?^;R>Q<@jdR;8,ADjM>_QW\O!R[HcO-plLR9>lER@BVtT:- - XmRTZPWRB)e0YF?E9Rp!4iRCesA^RQ1ZS6eB&"smTTir8+RN%\4F=Pue._6lV\gVqE/1>fuD"r"! - )EE9a@>1(ZA(j(pRRqt^9JcN%Fdc0Yg0(6J6%PJ1K,S0N>%rVXAV-@jK%b<$qGj:OH%Xh%K - GoPu)Jt137=cA>WE9V/B'#tY8ZDJZW[=FYRbOsuhl[mXY$1"kRd7-1n#mZ$Y?L\(Res;Bs0*FEYZh@:RgZIT&$[&eZ!/$LRiA - We+0lh1Z.:9=h4sk^L"]&2)G@fU?\WprV*!A)Hh_qlo - qf;%JfFV9S'WAW%D;TFVu-_1gZcFSA&6qE8j!Y/]I7^2'r--oV`Zi7Ho\+;0u1Fe-9Nh'Hq - 5Gd9tS&:`EZK`S6Ntf?cF'q`a!/rS86."DoWi=a'ZSf?YF+6"=dia+"lSh&MXH`J+W$,/.DrFskHA)n[oj?7MDI=9\Z+lp?nj8N'?5!.h - s:T")?Wh*Xtr`A4<9tWVL]Y8O)5%VEVIA/oN]fq"^^5;%PBnj?]`'0IGhOEcdTB[Jml<^CR - Su_/5YNm79lX%'dT"F=F^[*#Zls@a!T$-KWcg;e&m9\E3T%iYhhsMQGmU#)ET'Ph$n*_=hm - p>bWT)8!5s6q*4n6ZFiT*t/G&+L_TnR!+&T,[=X+7^Kunm;9kJ - D\$=8tMH*_#_XD=eoGk8mk#5%"!?=nKI9je#QHIq@dBC%hRJotOT&+*[Fn@=Xr3X'^R95=? - ^OGLJd9_S;AQrgCYg48L%oqHp/sT<%hGYPTEJqd6i0T=b!X^\f1kr*RMBT?I/ici"s7rEn1 - TTA0>%hu4_Xra4jfTBlL6n,FL$s'PO#TDSZ*!<7U8i/h%t*YA^46K+$YF?Ui[M+$?c=L;Bh - )3%,GOkB;T5p;@]jH.%\A=fk`jQ.kn[_-sTNm$:j5T$_8[>4%X1FhZgS\QnQh>IE>XH+dPQQe - V35!J/'pndduoRE]@8RG@Lc6(u\>oU9&DT2DTq"qY[5DRk\b4bPDIF%5ls1AmNr;/a?bO5p1s\!Q1K;sa9s - \s!3)28ok;lAE[-p+Q1Xu._:UB]n5Ys9P#=;7o2%N)P1fY>];7(Hf85_:0-V@:D[4b3P1t= - N[;mc3^:fK:e7oE3aZ[!f#hEB?Ul - Xj)-fQb#b:Uj))mJ##%26%Pg+/d6XX(erB_?!(ssLY^UBiJHDnXsF@fOG5[sA%9_XMr.WBa - cY;f2G]QK3EB4IA[utkQtA@EB:+D/.QPtQh+G$ - (UHN?Hf:r5$Z.YkbW[Z\sIEJ>@U-7cbhkFEaS)L'T.N.9?IS,gcq&(YXk+NiRNTm+mWXJ-c - T#uuYTO-m_n,)NcT9<_E=3ZJAIok7qID:!`pjPGokPBYB\*s6E5M,Z/J%tUTJ.Mnc5WB&N? - o/+>&1.QG\/>BVF:Ws77L;@?.0X+d(P<92%7.K`gB\&~>Q -Q q -0 g -4 w -0 J -0 j -[] 0.0 d -4 M q 1 0 0 -1 0 700 cm -2 23.609 m 64.223 23.609 l 64.223 595.379 l 2 595.379 l 2 23.609 l h -2 23.609 m S Q -q 1 0 0 -1 0 700 cm -91.895 80.117 m 771.305 80.117 l 771.305 583.871 l 91.895 583.871 l -91.895 80.117 l h -91.895 80.117 m S Q -q 1 0 0 -1 0 700 cm -84.645 640.48 m 774.199 640.48 l 774.199 698.547 l 84.645 698.547 l -84.645 640.48 l h -84.645 640.48 m S Q -q 1 0 0 -1 0 700 cm -87.551 586.77 m 769.844 586.77 l 769.844 602.738 l 87.551 602.738 l -87.551 586.77 l h -87.551 586.77 m S Q -q 1 0 0 -1 0 700 cm -83.195 605.641 m 772.75 605.641 l 772.75 640.48 l 83.195 640.48 l -83.195 605.641 l h -83.195 605.641 m S Q -q 1 0 0 -1 0 700 cm -64.324 78.676 m 91.906 78.676 l 91.906 598.383 l 64.324 598.383 l -64.324 78.676 l h -64.324 78.676 m S Q -2.798638 w -q 1 0 0 -1 0 700 cm -89.125 63.559 m 774.074 63.559 l 774.074 80.727 l 89.125 80.727 l -89.125 63.559 l h -89.125 63.559 m S Q -BT -40 0 0 40 359.016309 370.18186 Tm -/f-0-0 1 Tf -[<010202>41<01>78<03>]TJ --0.940084 -8.85691 Td -[<04>-2<05>1<0604>-2<05>1<070108>2<09>]TJ --0.689554 1.161355 Td -[<0a020b0c>-2<05>1<07>-1<0d>1<02>-1<0b0e>1<05>1<02>]TJ -0.149952 14.44435 Td -[<0902>-1<05>1<0f>-1<1001>1<02>-1<1105>]TJ -0 -40 40 0 98.934296 464.044189 Tm -[<0a12>1<07>-1<0d>1<02>-1<0b0e>1<05>1<02>]TJ --0.179075 -1.955155 Td -[<0d05>1<0f>-1<130d>1<05>1<02>]TJ -40 0 0 40 302.400244 123.393945 Tm -[<0f>-1<1312>49<1408>1<060708>1<1415>]TJ -ET -4 w -q 1 0 0 -1 0 700 cm -548.738 43.836 m 603.906 69.965 l S Q -589.445 636.883 m 578.789 633.078 l 607.52 628.324 l 585.641 647.539 l -589.445 636.883 l h -589.445 636.883 m f* -1.807476 w -q -1 0.473684 0.473684 1 0 700 cm --505.843 176.493 m -498.612 169.263 l -523.917 176.495 l -498.613 -183.724 l -505.843 176.493 l h --505.843 176.493 m S Q -4 w -q 1 0 0 -1 0 700 cm -107.426 463.375 m 78.391 531.605 l S Q -84.656 183.117 m 80.426 193.613 l 76.824 164.715 l 95.148 187.348 l -84.656 183.117 l h -84.656 183.117 m f* -1.840309 w -q 0.425532 1 1 -0.425532 0 700 cm --407.136 257.906 m -399.773 250.542 l -425.539 257.904 l -399.774 -265.265 l -407.136 257.906 l h --407.136 257.906 m S Q -4 w -q 1 0 0 -1 0 700 cm -580.676 560.637 m 647.457 595.477 l S Q -633.27 111.922 m 622.477 108.531 l 651 102.672 l 629.879 122.715 l -633.27 111.922 l h -633.27 111.922 m f* -1.77317 w -q -1 0.521739 0.521739 1 0 700 cm --738.944 -202.542 m -731.851 -209.634 l -756.674 -202.542 l -731.852 --195.449 l -738.944 -202.542 l h --738.944 -202.542 m S Q -Q -showpage -%%Trailer -count op_count sub {pop} repeat -countdictstack dict_count sub {end} repeat -cairo_eps_state restore -%%EOF diff --git a/docs/figs/layout_view_1024_16_annotated.pdf b/docs/figs/layout_view_1024_16_annotated.pdf deleted file mode 100644 index b7bad3d4..00000000 Binary files a/docs/figs/layout_view_1024_16_annotated.pdf and /dev/null differ diff --git a/docs/figs/methodology.eps b/docs/figs/methodology.eps deleted file mode 100644 index 57dd0aa7..00000000 --- a/docs/figs/methodology.eps +++ /dev/null @@ -1,866 +0,0 @@ -%!PS-Adobe-3.0 EPSF-3.0 -%%Creator: cairo 1.8.8 (http://cairographics.org) -%%CreationDate: Mon Oct 17 14:59:32 2011 -%%Pages: 1 -%%BoundingBox: 0 0 630 399 -%%DocumentData: Clean7Bit -%%LanguageLevel: 2 -%%EndComments -%%BeginProlog -/cairo_eps_state save def -/dict_count countdictstack def -/op_count count 1 sub def -userdict begin -/q { gsave } bind def -/Q { grestore } bind def -/cm { 6 array astore concat } bind def -/w { setlinewidth } bind def -/J { setlinecap } bind def -/j { setlinejoin } bind def -/M { setmiterlimit } bind def -/d { setdash } bind def -/m { moveto } bind def -/l { lineto } bind def -/c { curveto } bind def -/h { closepath } bind def -/re { exch dup neg 3 1 roll 5 3 roll moveto 0 rlineto - 0 exch rlineto 0 rlineto closepath } bind def -/S { stroke } bind def -/f { fill } bind def -/f* { eofill } bind def -/B { fill stroke } bind def -/B* { eofill stroke } bind def -/n { newpath } bind def -/W { clip } bind def -/W* { eoclip } bind def -/BT { } bind def -/ET { } bind def -/pdfmark where { pop globaldict /?pdfmark /exec load put } - { globaldict begin /?pdfmark /pop load def /pdfmark - /cleartomark load def end } ifelse -/BDC { mark 3 1 roll /BDC pdfmark } bind def -/EMC { mark /EMC pdfmark } bind def -/cairo_store_point { /cairo_point_y exch def /cairo_point_x exch def } def -/Tj { show currentpoint cairo_store_point } bind def -/TJ { - { - dup - type /stringtype eq - { show } { -0.001 mul 0 cairo_font_matrix dtransform rmoveto } ifelse - } forall - currentpoint cairo_store_point -} bind def -/cairo_selectfont { cairo_font_matrix aload pop pop pop 0 0 6 array astore - cairo_font exch selectfont cairo_point_x cairo_point_y moveto } bind def -/Tf { pop /cairo_font exch def /cairo_font_matrix where - { pop cairo_selectfont } if } bind def -/Td { matrix translate cairo_font_matrix matrix concatmatrix dup - /cairo_font_matrix exch def dup 4 get exch 5 get cairo_store_point - /cairo_font where { pop cairo_selectfont } if } bind def -/Tm { 2 copy 8 2 roll 6 array astore /cairo_font_matrix exch def - cairo_store_point /cairo_font where { pop cairo_selectfont } if } bind def -/g { setgray } bind def -/rg { setrgbcolor } bind def -/d1 { setcachedevice } bind def -%%EndProlog -11 dict begin -/FontType 42 def -/FontName /f-0-0 def -/PaintType 0 def -/FontMatrix [ 1 0 0 1 0 0 ] def -/FontBBox [ 0 0 0 0 ] def -/Encoding 256 array def -0 1 255 { Encoding exch /.notdef put } for -Encoding 1 /uni004D put -Encoding 2 /uni0065 put -Encoding 3 /uni006D put -Encoding 4 /uni006F put -Encoding 5 /uni0072 put -Encoding 6 /uni0079 put -Encoding 7 /uni0020 put -Encoding 8 /uni0043 put -Encoding 9 /uni0070 put -Encoding 10 /uni0069 put -Encoding 11 /uni006C put -Encoding 12 /uni0028 put -Encoding 13 /uni0050 put -Encoding 14 /uni0074 put -Encoding 15 /uni0068 put -Encoding 16 /uni006E put -Encoding 17 /uni0029 put -Encoding 18 /uni004C put -Encoding 19 /uni0067 put -Encoding 20 /uni0063 put -Encoding 21 /uni0061 put -Encoding 22 /uni0045 put -Encoding 23 /uni0046 put -Encoding 24 /uni002F put -Encoding 25 /uni0052 put -Encoding 26 /uni0041 put -Encoding 27 /uni0047 put -Encoding 28 /uni0044 put -Encoding 29 /uni0053 put -Encoding 30 /uni0049 put -Encoding 31 /uni0062 put -Encoding 32 /uni002E put -Encoding 33 /uni0056 put -Encoding 34 /uni002D put -Encoding 35 /uni0064 put -Encoding 36 /uni0073 put -Encoding 37 /uni0054 put -Encoding 38 /uni0077 put -Encoding 39 /uni007A put -Encoding 40 /uni0075 put -Encoding 41 /uni002C put -Encoding 42 /uni0078 put -Encoding 43 /uni0042 put -Encoding 44 /uni006B put -Encoding 45 /uni0055 put -Encoding 46 /uni0066 put -/CharStrings 47 dict dup begin -/.notdef 0 def -/uni004D 1 def -/uni0065 2 def -/uni006D 3 def -/uni006F 4 def -/uni0072 5 def -/uni0079 6 def -/uni0020 7 def -/uni0043 8 def -/uni0070 9 def -/uni0069 10 def -/uni006C 11 def -/uni0028 12 def -/uni0050 13 def -/uni0074 14 def -/uni0068 15 def -/uni006E 16 def -/uni0029 17 def -/uni004C 18 def -/uni0067 19 def -/uni0063 20 def -/uni0061 21 def -/uni0045 22 def -/uni0046 23 def -/uni002F 24 def -/uni0052 25 def -/uni0041 26 def -/uni0047 27 def -/uni0044 28 def -/uni0053 29 def -/uni0049 30 def -/uni0062 31 def -/uni002E 32 def -/uni0056 33 def -/uni002D 34 def -/uni0064 35 def -/uni0073 36 def -/uni0054 37 def -/uni0077 38 def -/uni007A 39 def -/uni0075 40 def -/uni002C 41 def -/uni0078 42 def -/uni0042 43 def -/uni006B 44 def -/uni0055 45 def -/uni0066 46 def -end readonly def -/sfnts [ -<00010000000a008000030020636d61700252f32d00001fd00000009c63767420ffd31d390000 -206c000001fc6670676de7b4f1c4000022680000008b676c79661cacd2b0000000ac00001f24 -68656164dd84a2d0000022f40000003668686561104507920000232c00000024686d7478d559 -18d200002350000000bc6c6f6361aa82b2fc0000240c000000606d617870046a063a0000246c -00000020707265703b07f1000000248c0000056800020066fe96046605a400030007001a400c -04fb0006fb0108057f0204002fc4d4ec310010d4ecd4ec301311211125211121660400fc7303 -1bfce5fe96070ef8f2720629000100c90000061f05d5000c00bf403403110708070211010208 -080702110302090a0901110a0a09420a070203080300af080b050908030201050a061c043e0a -1c00040d10fcecfcec11173931002f3cc4ec32111739304b5358071005ed071008ed071008ed -071005ed5922b2700e01015d405603070f080f09020a15021407130a260226072007260a200a -3407350a69027c027b07790a80028207820a90021604010b0313011b0323012c032708280934 -013c035608590965086a097608790981018d0395019b03145d005d1321090121112311012301 -1123c9012d017d017f012dc5fe7fcbfe7fc405d5fc0803f8fa2b051ffc000400fae100000002 -0071ffe3047f047b0014001b00704024001501098608880515a90105b90c01bb18b912b80c8c -1c1b1502081508004b02120f451c10fcecf4ecc4111239310010e4f4ece410ee10ee10f4ee11 -12393040293f1d701da01dd01df01d053f003f013f023f153f1b052c072f082f092c0a6f006f -016f026f156f1b095d71015d0115211e0133323637150e01232000111000333200072e012322 -0607047ffcb20ccdb76ac76263d06bfef4fec70129fce20107b802a5889ab90e025e5abec734 -34ae2a2c0138010a01130143feddc497b4ae9e00000100ba0000071d047b0022005a40260612 -09180f00061d07150c871d2003b81bbc19100700110f0808065011080f501c18081a462310fc -ec32fcfcfcec11123931002f3c3ce4f43cc4ec32111217393040133024502470249024a024a0 -24bf24df24ff2409015d013e0133321615112311342623220615112311342623220615112311 -33153e01333216042945c082afbeb972758fa6b972778da6b9b93fb0797aab03897c76f5e2fd -5c029ea19cbea4fd87029ea29bbfa3fd870460ae67627c00000000020071ffe30475047b000b -0017004a401306b91200b90cb8128c1809120f51031215451810fcecf4ec310010e4f4ec10ee -3040233f197b007b067f077f087f097f0a7f0b7b0c7f0d7f0e7f0f7f107f117b12a019f01911 -015d012206151416333236353426273200111000232200111000027394acab9593acac93f001 -12feeef0f1feef011103dfe7c9c9e7e8c8c7e99cfec8feecfeedfec701390113011401380000 -000100ba0000034a047b001100304014060b0700110b03870eb809bc070a06080008461210fc -c4ec3231002fe4f4ecc4d4cc11123930b450139f1302015d012e012322061511231133153e01 -33321617034a1f492c9ca7b9b93aba85132e1c03b41211cbbefdb20460ae6663050500000001 -003dfe56047f0460000f01a240430708020911000f0a110b0a00000f0e110f000f0d110c0d00 -000f0d110e0d0a0b0a0c110b0b0a420d0b0910000b058703bd0e0bbc100e0d0c0a0906030008 -0f040f0b1010d4c4c4111739310010e432f4ec113911391239304b5358071005ed071008ed07 -1008ed071005ed071008ed0705ed17325922014bb00a544bb008545b58bd0010ffc000010010 -001000403811373859014bb0145458bd00100040000100100010ffc0381137385940f0060005 -080609030d160a170d100d230d350d490a4f0a4e0d5a095a0a6a0a870d800d930d120a000a09 -060b050c0b0e0b0f1701150210041005170a140b140c1a0e1a0f270024012402200420052908 -2809250a240b240c270d2a0e2a0f201137003501350230043005380a360b360c380d390e390f -30114100400140024003400440054006400740084209450a470d490e490f4011540051015102 -5503500450055606550756085709570a550b550c590e590f501166016602680a690e690f6011 -7b08780e780f89008a09850b850c890d890e890f9909950b950c9a0e9a0fa40ba40cab0eab0f -b011cf11df11ff11655d005d050e012b01353332363f01013309013302934e947c936c4c5433 -21fe3bc3015e015ec368c87a9a488654044efc94036c00010073ffe3052705f000190036401a -0da10eae0a951101a100ae04951791118c1a07190d003014101a10fcec32ec310010e4f4ecf4 -ec10eef6ee30b40f1b1f1b02015d01152e0123200011100021323637150e0123200011100021 -3216052766e782ff00fef00110010082e7666aed84feadfe7a0186015386ed0562d55f5efec7 -fed8fed9fec75e5fd34848019f01670168019f470000000200bafe5604a4047b0010001c003e -401b1ab9000e14b90508b80e8c01bd03bc1d11120b471704000802461d10fcec3232f4ec3100 -10e4e4e4f4c4ec10c4ee304009601e801ea01ee01e04015d2511231133153e01333212111002 -2322260134262322061514163332360173b9b93ab17bccffffcc7bb10238a79292a7a79292a7 -a8fdae060aaa6461febcfef8fef8febc6101ebcbe7e7cbcbe7e7000200c10000017906140003 -0007002b400e06be04b100bc020501080400460810fc3cec3231002fe4fcec30400b10094009 -50096009700905015d1333112311331523c1b8b8b8b80460fba00614e900000100c100000179 -061400030022b7009702010800460410fcec31002fec30400d10054005500560057005f00506 -015d13331123c1b8b80614f9ec00000100b0fef2027b0612000d004f400f069800970e0d0700 -03120600130a0e10dce432ec113939310010fcec30014bb0135458bd000e00400001000e000e -ffc03811373859014bb00f5458bd000effc00001000e000e0040381137385901060215141217 -23260235341237027b86828385a0969594970612e6fe3ee7e7fe3be5eb01c6e0df01c4ec0002 -00c90000048d05d500080013003a40180195100095098112100a0802040005190d3f11001c09 -041410fcec32fcec11173931002ff4ecd4ec30400b0f151f153f155f15af1505015d01113332 -3635342623252132041514042b0111230193fe8d9a9a8dfe3801c8fb0101fefffbfeca052ffd -cf92878692a6e3dbdde2fda800010037000002f2059e0013003840190e05080f03a9001101bc -08870a0b08090204000810120e461410fc3cc4fc3cc432393931002fecf43cc4ec3211393930 -b2af1501015d01112115211114163b01152322263511233533110177017bfe854b73bdbdd5a2 -8787059efec28ffda0894e9a9fd202608f013e000000000100ba000004640614001300344019 -030900030e0106870e11b80c970a010208004e0d09080b461410fcec32f4ec31002f3cecf4c4 -ec1112173930b2601501015d0111231134262322061511231133113e013332160464b87c7c95 -acb9b942b375c1c602a4fd5c029e9f9ebea4fd870614fd9e6564ef00000100ba00000464047b -001300364019030900030e0106870e11b80cbc0a010208004e0d09080b461410fcec32f4ec31 -002f3ce4f4c4ec1112173930b46015cf1502015d0111231134262322061511231133153e0133 -32160464b87c7c95acb9b942b375c1c602a4fd5c029e9f9ebea4fd870460ae6564ef000100a4 -fef2026f0612000d001f400f079800970e0701000b12041308000e10dc3cf4ec113939310010 -fcec301333161215140207233612353402a4a096959596a08583830612ecfe3cdfe0fe3aebe5 -01c5e7e701c20000000100c90000046a05d500050025400c0295008104011c033a00040610fc -ecec31002fe4ec304009300750078003800404015d133311211521c9ca02d7fc5f05d5fad5aa -00020071fe56045a047b000b0028004a4023190c1d0912861316b90f03b92623b827bc09b90f -bd1a1d261900080c4706121220452910fcc4ecf4ec323231002fc4e4ece4f4c4ec10fed5ee11 -12393930b6602a802aa02a03015d01342623220615141633323617100221222627351e013332 -363d010e0123220211101233321617353303a2a59594a5a59495a5b8fefefa61ac51519e52b5 -b439b27ccefcfcce7cb239b8023dc8dcdcc8c7dcdcebfee2fee91d1eb32c2abdbf5b6362013a -01030104013a6263aa0000010071ffe303e7047b0019003f401b00860188040e860d880ab911 -04b917b8118c1a07120d004814451a10fce432ec310010e4f4ec10fef4ee10f5ee30400b0f1b -101b801b901ba01b05015d01152e0123220615141633323637150e0123220011100021321603 -e74e9d50b3c6c6b3509d4e4da55dfdfed6012d010655a20435ac2b2be3cdcde32b2baa242401 -3e010e0112013a2300000002007bffe3042d047b000a002500bc4027191f0b17090e00a91706 -b90e1120861fba1cb923b8118c170c001703180d09080b1f030814452610fcecccd4ec323211 -393931002fc4e4f4fcf4ec10c6ee10ee11391139123930406e301d301e301f3020302130223f -27401d401e401f402040214022501d501e501f50205021502250277027851d871e871f872087 -2185229027a027f0271e301e301f30203021401e401f40204021501e501f50205021601e601f -60206021701e701f70207021801e801f80208021185d015d0122061514163332363d01371123 -350e01232226353436332135342623220607353e0133321602bedfac816f99b9b8b83fbc88ac -cbfdfb0102a79760b65465be5af3f00233667b6273d9b4294cfd81aa6661c1a2bdc0127f8b2e -2eaa2727fc00000100c90000048b05d5000b002e401506950402950081089504ad0a05010907 -031c00040c10fcec32d4c4c431002fececf4ec10ee30b21f0d01015d13211521112115211121 -1521c903b0fd1a02c7fd3902f8fc3e05d5aafe46aafde3aa0000000100c90000042305d50009 -002940120695040295008104ad08050107031c00040a10fcec32d4c431002fecf4ec10ee30b2 -0f0b01015d13211521112115211123c9035afd700250fdb0ca05d5aafe48aafd370000010000 -ff4202b205d50003002d4014001a010201021a03000342029f008104020001032fc439393100 -10f4ec304b5358071005ed071005ed5922013301230208aafdf8aa05d5f96d000000000200c9 -0000055405d50013001c00b14035090807030a06110304030511040403420604001503041595 -0914950d810b040506031109001c160e050a191904113f140a1c0c041d10fcec32fcc4ec1117 -391139393931002f3cf4ecd4ec123912391239304b5358071005ed071005ed1117395922b240 -1e01015d40427a13010500050105020603070415001501140216031704250025012502260327 -06260726082609201e3601360246014602680575047505771388068807980698071f5d005d01 -1e01171323032e012b01112311212016151406011133323635342623038d417b3ecdd9bf4a8b -78dcca01c80100fc83fd89fe9295959202bc16907efe68017f9662fd8905d5d6d88dba024ffd -ee8783838500000200100000056805d50002000a00ba40410011010004050402110505040111 -0a030a0011020003030a0711050406110505040911030a08110a030a42000307950103810905 -09080706040302010009050a0b10d4c4173931002f3ce4d4ec1239304b5358071005ed0705ed -071005ed0705ed071008ed071005ed071005ed071008ed5922b2200c01015d403a0f00580076 -0070008c000507010802060309041601190256015802500c67016802780176027c0372047707 -780887018802800c980299039604175d005d090121013301230321032302bcfeee0225fe7be5 -0239d288fd5f88d5050efd1903aefa2b017ffe81000000010073ffe3058b05f0001d00394020 -00051b0195031b950812a111ae15950e91088c1e02001c1134043318190b101e10fcecfce4fc -c4310010e4f4ecf4ec10fed4ee11393930251121352111060423200011100021320417152626 -23200011100021323604c3feb6021275fee6a0fea2fe75018b015e9201076f70fc8bfeeefeed -011301126ba8d50191a6fd7f53550199016d016e01994846d75f60fecefed1fed2fece250000 -000200c9000005b005d500080011002e4015009509810195100802100a0005190d32001c0904 -1210fcecf4ec113939393931002fecf4ec30b2601301015d0111332000111000212521200011 -100029010193f40135011ffee1fecbfe42019f01b20196fe68fe50fe61052ffb770118012e01 -2c0117a6fe97fe80fe7efe96000000010087ffe304a205f00027007e403c0d0c020e0b021e1f -1e080902070a021f1f1e420a0b1e1f0415010015a11494189511049500942591118c281e0a0b -1f1b0700221b190e2d071914222810dcc4ecfcece4111239393939310010e4f4e4ec10eef6ee -10c6111739304b535807100eed11173907100eed1117395922b20f2901015db61f292f294f29 -035d01152e012322061514161f011e0115140421222627351e013332363534262f012e013534 -24333216044873cc5fa5b377a67ae2d7feddfee76aef807bec72adbc879a7be2ca0117f569da -05a4c53736807663651f192bd9b6d9e0302fd04546887e6e7c1f182dc0abc6e42600000100c9 -0000019305d500030039b700af02011c00040410fcec31002fec30014bb0105458bd0004ffc0 -00010004000400403811373859400d30054005500560058f059f05065d13331123c9caca05d5 -fa2b0000000200baffe304a40614000b001c0038401903b90c0f09b918158c0fb81b97190012 -1247180c06081a461d10fcec3232f4ec31002fece4f4c4ec10c6ee30b6601e801ea01e03015d -013426232206151416333236013e01333212111002232226271523113303e5a79292a7a79292 -a7fd8e3ab17bccffffcc7bb13ab9b9022fcbe7e7cbcbe7e702526461febcfef8fef8febc6164 -a8061400000100db000001ae00fe00030011b7008302011900180410fcec31002fec30373315 -23dbd3d3fefe000100100000056805d5000600b7402704110506050311020306060503110403 -000100021101010042030401af0006040302000505010710d4c4173931002fec3239304b5358 -071005ed071008ed071008ed071005ed5922b2500801015d406200032a03470447055a037d03 -8303070600070208040906150114021a041a052a002601260229042905250620083800330133 -023c043c053706480045014502490449054706590056066602690469057a0076017602790479 -057506800898009706295d005d21013309013301024afdc6d301d901dad2fdc705d5fb1704e9 -fa2b0001006401df027f028300030011b6009c020401000410dccc310010d4ec301321152164 -021bfde50283a40000020071ffe3045a06140010001c003840191ab9000e14b905088c0eb801 -970317040008024711120b451d10fcecf4ec323231002fece4f4c4ec10c4ee30b6601e801ea0 -1e03015d0111331123350e0123220211101233321601141633323635342623220603a2b8b83a -b17ccbffffcb7cb1fdc7a79292a8a89292a703b6025ef9eca86461014401080108014461fe15 -cbe7e7cbcbe7e7000001006fffe303c7047b002700e7403c0d0c020e0b531f1e080902070a53 -1e1f1e420a0b1e1f041500860189041486158918b91104b925b8118c281e0a0b1f1b0700521b -080e07081422452810fcc4ecd4ece4111239393939310010e4f4ec10fef5ee10f5ee12173930 -4b535807100eed111739070eed1117395922b2002701015d406d1c0a1c0b1c0c2e092c0a2c0b -2c0c3b093b0a3b0b3b0c0b200020012402280a280b2a132f142f152a16281e281f2920292124 -27860a860b860c860d12000000010202060a060b030c030d030e030f03100319031a031b031c -041d09272f293f295f297f2980299029a029f029185d005d7101152e012322061514161f011e -0115140623222627351e013332363534262f012e01353436333216038b4ea85a898962943fc4 -a5f7d85ac36c66c661828c65ab40ab98e0ce66b4043fae282854544049210e2a99899cb62323 -be353559514b50250f2495829eac1e0000000001fffa000004e905d50007004a400e06029500 -81040140031c0040050810d4e4fce431002ff4ec3230014bb00a5458bd000800400001000800 -08ffc03811373859401300091f00100110021f071009400970099f09095d0321152111231121 -0604effdeecbfdee05d5aafad5052b0000010056000006350460000c0201404905550605090a -0904550a0903550a0b0a025501020b0b0a061107080705110405080807021103020c000c0111 -00000c420a050203060300bf0b080c0b0a09080605040302010b07000d10d4cc173931002f3c -ec32321739304b5358071005ed071008ed071008ed071005ed071008ed071005ed0705ed0710 -08ed5922014bb00a544bb011545b4bb012545b4bb013545b4bb00b545b58bd000dffc0000100 -0d000d00403811373859014bb00c544bb00d545b4bb010545b58bd000d00400001000d000dff -c0381137385940ff050216021605220a350a49024905460a400a5b025b05550a500a6e026e05 -660a79027f0279057f05870299029805940abc02bc05ce02c703cf051d0502090306040b050a -080b09040b050c1502190316041a051b081b09140b150c250025012302270321042505220622 -0725082709240a210b230c390336043608390c300e4602480346044004420540064007400844 -09440a440b400e400e560056015602500451055206520750085309540a550b6300640165026a -0365046a056a066a076e09610b670c6f0e7500750179027d0378047d057a067f067a077f0778 -0879097f097b0a760b7d0c870288058f0e97009701940293039c049b05980698079908402f96 -0c9f0ea600a601a402a403ab04ab05a906a907ab08a40caf0eb502b103bd04bb05b809bf0ec4 -02c303cc04ca05795d005d13331b01331b013301230b012356b8e6e5d9e6e5b8fedbd9f1f2d9 -0460fc96036afc96036afba00396fc6a000000010058000003db0460000900b4401a08110203 -0203110708074208a900bc03a905080301000401060a10dcc432c411393931002fecf4ec304b -5358071005ed071005ed5922014bb00b544bb00c545b58bd000a00400001000a000affc03811 -373859014bb0135458bd000affc00001000a000a004038113738594042050216022602470249 -07050b080f0b18031b082b08200b36033908300b400140024503400440054308570359085f0b -6001600266036004600562087f0b800baf0b1b5d005d1321150121152135012171036afd4c02 -b4fc7d02b4fd650460a8fcdb93a803250000000100aeffe30458046000130036401903090003 -0e0106870e118c0a01bc0c0d09080b4e020800461410fcecf4ec3231002fe432f4c4ec111217 -3930b46015cf1502015d1311331114163332363511331123350e01232226aeb87c7c95adb8b8 -43b175c1c801ba02a6fd619f9fbea4027bfba0ac6663f0000001009eff1201c300fe00050019 -400c039e0083060304011900180610fcecd4cc310010fcec30373315032313f0d3a48152feac -fec001400001003b000004790460000b015a4046051106070604110304070706041105040102 -0103110202010b110001000a11090a0101000a110b0a0708070911080807420a070401040800 -bf05020a0704010408000208060c10d4c4d4c411173931002f3cec321739304b5358071005ed -071008ed071008ed071005ed071005ed071008ed071008ed071005ed5922014bb00a544bb00f -545b4bb010545b4bb011545b58bd000cffc00001000c000c00403811373859014bb0145458bd -000c00400001000c000cffc0381137385940980a04040a1a04150a260a3d04310a5504570758 -0a660a76017a047607740a8d04820a99049f049707920a900aa601a904af04a507a30aa00a1c -0a03040505090a0b1a03150515091a0b2903260525092a0b200d3a013903370534073609390b -300d4903460545094a0b400d590056015902590357055606590756085609590b500d6f0d7801 -7f0d9b019407ab01a407b00dcf0ddf0dff0d2f5d005d09022309012309013309010464fe6b01 -aad9febafebad901b3fe72d9012901290460fddffdc101b8fe48024a0216fe71018f00000003 -00c9000004ec05d5000800110020004340231900950a0995128101950aad1f110b080213191f -05000e1c1605191c2e09001c12042110fcec32fcecd4ec111739393931002fececf4ec10ee39 -30b20f2201015d01112132363534262301112132363534262325213216151406071e01151404 -232101930144a39d9da3febc012b94919194fe0b0204e7fa807c95a5fef0fbfde802c9fddd87 -8b8c850266fe3e6f727170a6c0b189a21420cb98c8da000100ba0000049c0614000a00bc4029 -0811050605071106060503110405040211050504420805020303bc0097090605010406080108 -00460b10fcec32d4c4113931002f3cece41739304b5358071004ed071005ed071005ed071004 -ed5922b2100c01015d405f04020a081602270229052b0856026602670873027705820289058e -08930296059708a3021209050906020b030a072803270428052b062b07400c6803600c890385 -0489058d068f079a039707aa03a705b607c507d607f703f003f704f0041a5d71005d13331101 -33090123011123bab90225ebfdae026bf0fdc7b90614fc6901e3fdf4fdac0223fddd000100b2 -ffe3052905d50011004b40160802110b0005950e8c09008112081c0a38011c00411210fcecfc -ec310010e432f4ec113939393930014bb0105458bd00120040000100120012ffc03811373859 -b61f138f139f13035d133311141633323635113311100021200011b2cbaec3c2aecbfedffee6 -fee5fedf05d5fc75f0d3d3f0038bfc5cfedcfed6012a012400000001002f000002f806140013 -0070401c0510010c08a906018700970e06bc0a02130700070905080d0f0b4c1410fc3cc4fc3c -c4c412393931002fe432fcec10ee3212393930014bb00a5458bd0014ffc00001001400140040 -3811373859014bb00e5458bd00140040000100140014ffc03811373859b640155015a015035d -01152322061d012115211123112335333534363302f8b0634d012ffed1b9b0b0aebd06149950 -68638ffc2f03d18f4ebbab000000000200030000000000140001000000000034000400200000 -0004000400010000f02effff0000f000ffff10000001000000000006006800000000002f0000 -000100020003000400050006000700080009000a000b000c000d000e000f0010001100120013 -001400150016001700180019001a001b001c001d001e001f0020002100220023002400250026 -002700280029002a002b002c002d002e013500b800cb00cb00c100aa009c01a600b800660000 -007100cb00a002b20085007500b800c301cb0189022d00cb00a600f000d300aa008700cb03aa -0400014a003300cb000000d9050200f4015400b4009c01390114013907060400044e04b40452 -04b804e704cd0037047304cd04600473013303a2055605a60556053903c5021200c9001f00b8 -01df007300ba03e9033303bc0444040e00df03cd03aa00e503aa0404000000cb008f00a4007b -00b80014016f007f027b0252008f00c705cd009a009a006f00cb00cd019e01d300f000ba0183 -00d5009803040248009e01d500c100cb00f600830354027f00000333026600d300c700a400cd -008f009a0073040005d5010a00fe022b00a400b4009c00000062009c0000001d032d05d505d5 -05d505f0007f007b005400a406b80614072301d300b800cb00a601c301ec069300a000d3035c -037103db0185042304a80448008f0139011401390360008f05d5019a06140723066601790460 -04600460047b009c00000277046001aa00e904600762007b00c5007f027b000000b4025205cd -006600bc00660077061000cd013b01850389008f007b0000001d00cd074a042f009c009c0000 -077d006f0000006f0335006a006f007b00ae00b2002d0396008f027b00f600830354063705f6 -008f009c04e10266008f018d02f600cd03440029006604ee007300001400b606050403020100 -2c2010b002254964b040515820c859212d2cb002254964b040515820c859212d2c20100720b0 -0050b00d7920b8ffff5058041b0559b0051cb0032508b0042523e120b00050b00d7920b8ffff -5058041b0559b0051cb0032508e12d2c4b505820b0fd454459212d2cb002254560442d2c4b53 -58b00225b0022545445921212d2c45442d000001000000020000322394a85f0f3cf5001f0800 -00000000bab9f0b800000000bac26791fe89fe1d0a4c076d0000000800010000000000000001 -0000076dfe1d00000abcfe89fe890a4c00010000000000000000000000000000002f04cd0066 -06e700c904ec007107cb00ba04e50071034a00ba04bc003d028b000005960073051400ba0239 -00c1023900c1031f00b004d300c903230037051200ba051200ba031f00a4047500c905140071 -0466007104e7007b050e00c9049a00c902b20000058f00c90579001006330073062900c90514 -0087025c00c9051400ba028b00db0579001002e3006405140071042b006f04e3fffa068b0056 -04330058051200ae028b009e04bc003b057d00c904a200ba05db00b202d1002f0000002200a0 -010a016c01be01f602e602e60332038003a803c6040a044a048804c40500052c054e05b205fe -069406c406ee0714079e0818086c08ac09280952099e09b20a220a380a840b340b6c0c8a0cfc -0d380d540e220e7a0ef20f3a0f9200010000002f004d00070042000400020010004000070000 -0415056800030001b8028040fffbfe03fa1403f92503f83203f79603f60e03f5fe03f4fe03f3 -2503f20e03f19603f02503ef8a4105effe03ee9603ed9603ecfa03ebfa03eafe03e93a03e842 -03e7fe03e63203e5e45305e59603e48a4105e45303e3e22f05e3fa03e22f03e1fe03e0fe03df -3203de1403dd9603dcfe03db1203da7d03d9bb03d8fe03d68a4105d67d03d5d44705d57d03d4 -4703d3d21b05d3fe03d21b03d1fe03d0fe03cffe03cefe03cd9603cccb1e05ccfe03cb1e03ca -3203c9fe03c6851105c61c03c51603c4fe03c3fe03c2fe03c1fe03c0fe03bffe03befe03bdfe -03bcfe03bbfe03ba1103b9862505b9fe03b8b7bb05b8fe03b7b65d05b7bb03b78004b6b52505 -b65d40ff03b64004b52503b4fe03b39603b2fe03b1fe03b0fe03affe03ae6403ad0e03acab25 -05ac6403abaa1205ab2503aa1203a98a4105a9fa03a8fe03a7fe03a6fe03a51203a4fe03a3a2 -0e05a33203a20e03a16403a08a4105a096039ffe039e9d0c059efe039d0c039c9b19059c6403 -9b9a10059b19039a1003990a0398fe0397960d0597fe03960d03958a410595960394930e0594 -2803930e0392fa039190bb0591fe03908f5d0590bb039080048f8e25058f5d038f40048e2503 -8dfe038c8b2e058cfe038b2e038a8625058a410389880b05891403880b038786250587640386 -85110586250385110384fe038382110583fe0382110381fe0380fe037ffe0340ff7e7d7d057e -fe037d7d037c64037b5415057b25037afe0379fe03780e03770c03760a0375fe0374fa0373fa -0372fa0371fa0370fe036ffe036efe036c21036bfe036a1142056a530369fe03687d03671142 -0566fe0365fe0364fe0363fe0362fe03613a0360fa035e0c035dfe035bfe035afe0359580a05 -59fa03580a035716190557320356fe035554150555420354150353011005531803521403514a -130551fe03500b034ffe034e4d10054efe034d10034cfe034b4a13054bfe034a4910054a1303 -491d0d05491003480d0347fe0346960345960344fe0343022d0543fa0342bb03414b0340fe03 -3ffe033e3d12053e14033d3c0f053d12033c3b0d053c40ff0f033b0d033afe0339fe03383714 -0538fa033736100537140336350b05361003350b03341e03330d0332310b0532fe03310b0330 -2f0b05300d032f0b032e2d09052e10032d09032c32032b2a25052b64032a2912052a25032912 -032827250528410327250326250b05260f03250b0324fe0323fe03220f032101100521120320 -64031ffa031e1d0d051e64031d0d031c1142051cfe031bfa031a42031911420519fe03186403 -1716190517fe031601100516190315fe0314fe0313fe031211420512fe0311022d0511420310 -7d030f64030efe030d0c16050dfe030c0110050c16030bfe030a100309fe0308022d0508fe03 -0714030664030401100504fe03401503022d0503fe0302011005022d0301100300fe0301b801 -64858d012b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b -2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b -2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b -2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b -2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b002b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b -2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b -2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b -2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b -2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b1d00> -] def -FontName currentdict end definefont pop -%%Page: 1 1 -%%BeginPageSetup -%%PageBoundingBox: 0 0 630 399 -%%EndPageSetup -q -0 g -1.005231 w -0 J -0 j -[] 0.0 d -4 M q 1 0 0 -1 0 398.268463 cm -220.387 54.336 m 351.496 54.336 l 351.496 88.773 l 220.387 88.773 l -220.387 54.336 l h -220.387 54.336 m S Q -BT -9.6 0 0 9.6 240.400003 325.596368 Tm -/f-0-0 1 Tf -[<01>1<02>2<03>2<0405>-1<060708>-1<0403>2<090a0b>1<02>2<05>]TJ -0 -1.25 Td -[<0c0d>-1<060e0f>-1<0410>-1<11>]TJ -ET -1.60016 w -q 1 0 0 -1 0 398.268463 cm -175.582 163.477 m 175.582 168.566 160.82 172.695 142.613 172.695 c -124.402 172.695 109.645 168.566 109.645 163.477 c 109.645 158.383 -124.402 154.254 142.613 154.254 c 160.82 154.254 175.582 158.383 -175.582 163.477 c h -175.582 163.477 m S Q -q 1 0 0 -1 0 398.268463 cm -175.504 212.371 m 175.504 217.461 160.742 221.59 142.535 221.59 c -124.328 221.59 109.566 217.461 109.566 212.371 c 109.566 207.277 -124.328 203.148 142.535 203.148 c 160.742 203.148 175.504 207.277 -175.504 212.371 c h -175.504 212.371 m S Q -1.6 w -q 1 0 0 -1 0 398.268463 cm -175.023 163.754 m 175.023 212.371 l S Q -q 1 0 0 -1 0 398.268463 cm -109.645 163.477 m 109.645 212.09 l S Q -1.60016 w -q 1 0 0 -1 0 398.268463 cm -311.406 163.895 m 311.406 168.988 296.645 173.113 278.438 173.113 c -260.227 173.113 245.469 168.988 245.469 163.895 c 245.469 158.801 -260.227 154.676 278.438 154.676 c 296.645 154.676 311.406 158.801 -311.406 163.895 c h -311.406 163.895 m S Q -q 1 0 0 -1 0 398.268463 cm -311.328 212.789 m 311.328 217.879 296.566 222.008 278.359 222.008 c -260.152 222.008 245.391 217.879 245.391 212.789 c 245.391 207.695 -260.152 203.57 278.359 203.57 c 296.566 203.57 311.328 207.695 311.328 -212.789 c h -311.328 212.789 m S Q -1.6 w -q 1 0 0 -1 0 398.268463 cm -310.844 164.176 m 310.844 212.789 l S Q -q 1 0 0 -1 0 398.268463 cm -245.469 163.895 m 245.469 212.508 l S Q -1.60016 w -q 1 0 0 -1 0 398.268463 cm -439.926 166.688 m 439.926 171.781 425.164 175.91 406.957 175.91 c -388.75 175.91 373.988 171.781 373.988 166.688 c 373.988 161.598 388.75 -157.469 406.957 157.469 c 425.164 157.469 439.926 161.598 439.926 -166.688 c h -439.926 166.688 m S Q -q 1 0 0 -1 0 398.268463 cm -439.848 215.582 m 439.848 220.676 425.09 224.801 406.883 224.801 c -388.672 224.801 373.914 220.676 373.914 215.582 c 373.914 210.492 -388.672 206.363 406.883 206.363 c 425.09 206.363 439.848 210.492 -439.848 215.582 c h -439.848 215.582 m S Q -1.6 w -q 1 0 0 -1 0 398.268463 cm -439.367 166.969 m 439.367 215.582 l S Q -q 1 0 0 -1 0 398.268463 cm -373.988 166.688 m 373.988 215.305 l S Q -1.60016 w -q 1 0 0 -1 0 398.268463 cm -252.73 339.355 m 252.73 344.445 237.973 348.574 219.762 348.574 c -201.555 348.574 186.793 344.445 186.793 339.355 c 186.793 334.262 -201.555 330.133 219.762 330.133 c 237.973 330.133 252.73 334.262 252.73 -339.355 c h -252.73 339.355 m S Q -q 1 0 0 -1 0 398.268463 cm -252.656 388.25 m 252.656 393.34 237.895 397.469 219.688 397.469 c -201.48 397.469 186.719 393.34 186.719 388.25 c 186.719 383.156 201.48 -379.027 219.688 379.027 c 237.895 379.027 252.656 383.156 252.656 -388.25 c h -252.656 388.25 m S Q -1.6 w -q 1 0 0 -1 0 398.268463 cm -252.172 339.633 m 252.172 388.25 l S Q -q 1 0 0 -1 0 398.268463 cm -186.793 339.355 m 186.793 387.969 l S Q -BT -9.6 0 0 9.6 75.557163 243.454333 Tm -/f-0-0 1 Tf -[<12>18<04>1<130a14>1<15>-2<0b>]TJ -18.684519 -2.996216 Td -[<1216>1<17>1<18>-1<17>1<19>41<1a01>]TJ -0 -1.25 Td -[<1b1c1d>-2<1e1e>]TJ -12.805588 0.0276477 Td -[<120a>1<1f02>2<05>-1<0e>-1<06070c>-1<200b0a>1<1f11>]TJ --26.891736 1.133586 Td -[<1d>-2<090a>1<14>1<02>1<18>-1<12>110<21>1<1d>]TJ -0 -1.25 Td -[<21>79<02>2<05>-1<0a0b>1<0413>]TJ -8.43187 5.747114 Td -[<17>73<05>21<0410>-1<0e22>-1<16>1<10>-1<23>]TJ -0 -1.25 Td -[<0d0f>-1<0624>-1<0a>1<14>1<15>-3<0b>]TJ -25.203725 -0.0305608 Td -[<16>1<24>-1<0e0a03>2<15>-2<0e>-1<02>2<23>]TJ -0 -1.25 Td -[<25>29<0a03>2<0a10>-1<1318>-1<0d>35<042602>2<05>]TJ -ET -1.005231 w -q 1 0 0 -1 0 398.268463 cm -156.406 248.234 m 287.516 248.234 l 287.516 282.676 l 156.406 282.676 l -156.406 248.234 l h -156.406 248.234 m S Q -BT -9.6 0 0 9.6 168.816605 130.165637 Tm -/f-0-0 1 Tf -[<01>1<02>2<03>2<0405>-1<060708>-1<0f>-1<15>-2<05>-1<15>-3<14>1<0e02>2<05>-1<0a -27>]TJ -10.126953 0 Td -[<02>2<05>]TJ --10.126953 -1.25 Td -[<0c0d>-1<060e0f>-1<0410>-1<11>]TJ -ET -0.921608 w -[ 5.529648 0.921608] 0 d -q 1 0 0 1 0 398.268463 cm -0.461 -281.039 m 116.008 -281.039 l 116.008 -248.191 l 0.461 -248.191 l -0.461 -281.039 l h -0.461 -281.039 m S Q -BT -9.6 0 0 9.6 4.795825 134.635925 Tm -/f-0-0 1 Tf -[<1d>-2<0a>1<03>1<28>-1<0b>1<15>-3<0e0405>]TJ -0 -1.25 Td -[<0c02>1<201320>-1<0710>-1<1324090a14>1<02>2<29>-1<0724>-1<0902>2<14>1<0e -05>]TJ -10.197266 0 Td -[<02>2<11>]TJ -ET -0.874385 w -[ 0.874385 1.748769] 0 d -q 1 0 0 -1 0 398.268463 cm -331.52 249.285 m 435.379 249.285 l 435.379 282.18 l 331.52 282.18 l -331.52 249.285 l h -331.52 249.285 m S Q -BT -9.6 0 0 9.6 345.902591 136.871082 Tm -/f-0-0 1 Tf -[<16>1<2a0e>-1<0515>-3<14>1<0e0405>]TJ -0 -1.25 Td -[<0c02>1<201320>-1<0708>-1<15>-2<0b0a>1<1f05>20<02>2<11>]TJ --23.853645 -9.999148 Td -[<1a1010>-1<040e15>-3<0e02>2<23>]TJ -0 -1.25 Td -[<25>29<0a03>2<0a10>-1<1318>-1<0d>35<042602>2<05>]TJ -7.661297 2.021848 Td -[<120a>1<1f02>2<05>-1<0e>-1<06070c>-1<200b0a>1<1f11>]TJ -0 -1.25 Td -[<1d>-2<090a>1<14>1<02>]TJ -ET -1.6 w -[] 0.0 d -q 1 0 0 -1 0 398.268463 cm -280.633 88.879 m 145.965 152.578 l S Q -151.75 248.425 m 153.273 252.686 l 144.52 245.007 l 156.012 246.901 l -151.75 248.425 l h -151.75 248.425 m f* -0.723173 w -q 1 0.473029 0.473029 -1 0 398.268463 cm -66.083 181.103 m 68.975 178.209 l 58.853 181.101 l 68.977 183.995 l -66.083 181.103 l h -66.083 181.103 m S Q -1.6 w -q 1 0 0 -1 0 398.268463 cm -280.074 89.438 m 280.074 153.695 l S Q -280.074 250.972 m 276.875 254.171 l 280.074 242.972 l 283.273 254.171 l -280.074 250.972 l h -280.074 250.972 m f* -0.8 w -q -0.000000000000000061 1 1 0.000000000000000061 0 398.268463 cm --147.297 280.074 m -144.098 276.875 l -155.297 280.074 l -144.098 -283.273 l -147.297 280.074 l h --147.297 280.074 m S Q -1.6 w -q 1 0 0 -1 0 398.268463 cm -285.27 89.043 m 340.207 121.863 l S Q -334.711 279.69 m 330.324 278.581 l 341.578 275.585 l 333.605 284.077 l -334.711 279.69 l h -334.711 279.69 m f* -0.686779 w -q -1 0.597406 0.597406 1 0 398.268463 cm --298.881 59.975 m -296.137 57.226 l -305.75 59.973 l -296.135 62.722 l --298.881 59.975 l h --298.881 59.975 m S Q -1.6 w -q 1 0 0 -1 0 398.268463 cm -155.465 265.453 m 116.348 265.453 l S Q -149.062 132.815 m 145.863 129.612 l 157.062 132.815 l 145.863 136.015 l -149.062 132.815 l h -149.062 132.815 m f* -0.8 w -q -1 -0.000000000000000122 -0.000000000000000122 1 0 398.268463 cm --149.062 -265.453 m -145.863 -268.656 l -157.062 -265.453 l -145.863 --262.254 l -149.062 -265.453 l h --149.062 -265.453 m S Q -122.75 132.815 m 125.949 136.015 l 114.75 132.815 l 125.949 129.612 l -122.75 132.815 l h -122.75 132.815 m f* -q 1 -0.000000000000000122 -0.000000000000000122 -1 0 398.268463 cm -122.75 265.453 m 125.949 262.254 l 114.75 265.453 l 125.949 268.656 l -122.75 265.453 l h -122.75 265.453 m S Q -1.6 w -q 1 0 0 -1 0 398.268463 cm -252.395 219.602 m 218.934 247.098 l S Q -223.879 155.233 m 224.32 159.737 l 217.699 150.155 l 228.383 154.792 l -223.879 155.233 l h -223.879 155.233 m f* -0.618042 w -q 1 0.821886 0.821886 -1 0 398.268463 cm -14.403 254.873 m 16.876 252.401 l 8.224 254.872 l 16.874 257.345 l -14.403 254.873 l h -14.403 254.873 m S Q -1.005231 w -q 1 0 0 -1 0 398.268463 cm -341.922 104.066 m 473.031 104.066 l 473.031 138.508 l 341.922 138.508 l -341.922 104.066 l h -341.922 104.066 m S Q -BT -9.6 0 0 9.6 354.334622 274.333276 Tm -/f-0-0 1 Tf -[<01>1<02>2<03>2<0405>-1<060708>-1<0f>-1<15>-2<05>-1<15>-3<14>1<0e02>2<05>-1<0a -27>]TJ -10.126953 0 Td -[<02>2<05>]TJ --10.126953 -1.25 Td -[<0c0d>-1<060e0f>-1<0410>-1<11>]TJ -ET -1.6 w -q 1 0 0 -1 0 398.268463 cm -408.594 137.887 m 408.594 156.578 l S Q -408.594 248.089 m 405.395 251.288 l 408.594 240.089 l 411.797 251.288 l -408.594 248.089 l h -408.594 248.089 m f* -0.8 w -q -0.000000000000000061 1 1 0.000000000000000061 0 398.268463 cm --150.18 408.594 m -146.98 405.395 l -158.18 408.594 l -146.98 411.797 l --150.18 408.594 l h --150.18 408.594 m S Q -1.6 w -q 1 0 0 -1 0 398.268463 cm -157.699 221.309 m 200.727 247.016 l S Q -195.23 154.538 m 190.844 153.429 l 202.098 150.433 l 194.125 158.925 l -195.23 154.538 l h -195.23 154.538 m f* -0.68678 w -q -1 0.597403 0.597403 1 0 398.268463 cm --251.189 -93.67 m -248.444 -96.418 l -258.057 -93.672 l -248.443 --90.923 l -251.189 -93.67 l h --251.189 -93.67 m S Q -2.4 w -[ 7.2 7.2] 0 d -q 1 0 0 -1 0 398.268463 cm -22.473 236.957 m 597.465 236.957 l S Q -BT -16 0 0 16 5.708505 64.082971 Tm -/f-0-0 1 Tf -[<2b15>-2<14>1<2c>1<22161023>]TJ -0 -1 Td -[<01>1<02>2<0e0f>-1<042304>1<0b04>1<1306>]TJ -0.674965 15.682794 Td -[<17>73<05>21<0410>-1<0e22>-1<16>1<10>-1<23>]TJ -0 -1 Td -[<01>1<02>2<0e0f>-1<042304>1<0b04>1<1306>]TJ -ET -0.921608 w -[ 5.529648 0.921608] 0 d -q 1 0 0 1 0 398.268463 cm -514.727 -138.27 m 630.273 -138.27 l 630.273 -105.422 l 514.727 -105.422 -l 514.727 -138.27 l h -514.727 -138.27 m S Q -BT -9.6 0 0 9.6 519.059866 277.406592 Tm -/f-0-0 1 Tf -[<1d>-2<0a>1<03>1<28>-1<0b>1<15>-3<0e0405>]TJ -0 -1.25 Td -[<0c02>1<201320>-1<0710>-1<1324090a14>1<02>2<29>-1<0724>-1<0902>2<14>1<0e -05>]TJ -10.197266 0 Td -[<02>2<11>]TJ -ET -1.6 w -[] 0.0 d -q 1 0 0 -1 0 398.268463 cm -513.824 122.125 m 474.711 122.125 l S Q -507.426 276.143 m 504.227 272.944 l 515.426 276.143 l 504.227 279.343 l -507.426 276.143 l h -507.426 276.143 m f* -0.8 w -q -1 -0.000000000000000122 -0.000000000000000122 1 0 398.268463 cm --507.426 -122.125 m -504.227 -125.324 l -515.426 -122.125 l -504.227 --118.926 l -507.426 -122.125 l h --507.426 -122.125 m S Q -481.109 276.143 m 484.312 279.343 l 473.109 276.143 l 484.312 272.944 l -481.109 276.143 l h -481.109 276.143 m f* -q 1 -0.000000000000000122 -0.000000000000000122 -1 0 398.268463 cm -481.109 122.125 m 484.312 118.926 l 473.109 122.125 l 484.312 125.324 l -481.109 122.125 l h -481.109 122.125 m S Q -1.60016 w -q 1 0 0 -1 0 398.268463 cm -488.539 29.785 m 488.539 34.879 473.781 39.004 455.57 39.004 c 437.363 -39.004 422.602 34.879 422.602 29.785 c 422.602 24.691 437.363 20.566 -455.57 20.566 c 473.781 20.566 488.539 24.691 488.539 29.785 c h -488.539 29.785 m S Q -q 1 0 0 -1 0 398.268463 cm -488.465 78.68 m 488.465 83.77 473.703 87.898 455.496 87.898 c 437.289 -87.898 422.527 83.77 422.527 78.68 c 422.527 73.586 437.289 69.461 -455.496 69.461 c 473.703 69.461 488.465 73.586 488.465 78.68 c h -488.465 78.68 m S Q -1.6 w -q 1 0 0 -1 0 398.268463 cm -487.98 30.062 m 487.98 78.68 l S Q -q 1 0 0 -1 0 398.268463 cm -422.602 29.785 m 422.602 78.398 l S Q -BT -9.6 0 0 9.6 441.005374 347.123721 Tm -/f-0-0 1 Tf -[<25>167<02>2<14>1<0f>]TJ -0 -1.25 Td -[<120a>1<1f05>-1<15>-2<05>-1<06>]TJ -ET -q 1 0 0 -1 0 398.268463 cm -422.809 52.973 m 353.52 73.09 l S Q -359.664 326.964 m 361.848 330.929 l 351.984 324.733 l 363.629 324.784 l -359.664 326.964 l h -359.664 326.964 m f* -0.768277 w -q 1 0.290323 0.290323 -1 0 398.268463 cm -312.613 162.063 m 315.689 158.991 l 304.933 162.064 l 315.686 165.135 l -312.613 162.063 l h -312.613 162.063 m S Q -1.6 w -q 1 0 0 -1 0 398.268463 cm -282.879 22.918 m 282.32 51.973 l S Q -282.441 352.694 m 279.305 355.956 l 282.289 344.694 l 285.703 355.831 l -282.441 352.694 l h -282.441 352.694 m f* -0.799852 w -q 0.0192309 1 1 -0.0192309 0 398.268463 cm --40.128 283.213 m -36.928 280.015 l -48.128 283.215 l -36.93 286.413 l --40.128 283.213 l h --40.128 283.213 m S Q -BT -9.6 0 0 9.6 199.049588 390.974713 Tm -/f-0-0 1 Tf -[<2d24>-1<02>2<05>-1<071d>-2<0902>2<140a>1<2e>-1<0a14>1<15>-2<0e>-1<0a>1<04 -10>]TJ -0 -1.25 Td -[<0c26>-1<04>1<05>16<230724>-1<0a>1<27>-1<02>2<2907>-1<03>2<02>2<03>1<04 -050607>]TJ -10.234375 0 Td -[<240a2702>1<2907>-1<15>-2<240902>2<140e0705>-1<15>-3<0e0a04>1<29>-1<07 -02>2<0e>]TJ -10.169922 0 Td -<1420>Tj -ET -1.6 w -q 1 0 0 -1 0 398.268463 cm -327.57 265.453 m 288.457 265.453 l S Q -321.172 132.815 m 317.973 129.612 l 329.172 132.815 l 317.973 136.015 l -321.172 132.815 l h -321.172 132.815 m f* -0.8 w -q -1 -0.000000000000000122 -0.000000000000000122 1 0 398.268463 cm --321.172 -265.453 m -317.973 -268.656 l -329.172 -265.453 l -317.973 --262.254 l -321.172 -265.453 l h --321.172 -265.453 m S Q -294.855 132.815 m 298.055 136.015 l 286.855 132.815 l 298.055 129.612 l -294.855 132.815 l h -294.855 132.815 m f* -q 1 -0.000000000000000122 -0.000000000000000122 -1 0 398.268463 cm -294.855 265.453 m 298.055 262.254 l 286.855 265.453 l 298.055 268.656 l -294.855 265.453 l h -294.855 265.453 m S Q -1.370434 w -q 1 0 0 -1 0 398.268463 cm -219.727 282.898 m 219.727 328.188 l S Q -219.727 75.561 m 216.984 78.304 l 219.727 68.71 l 222.465 78.304 l -219.727 75.561 l h -219.727 75.561 m f* -0.685217 w -q -0.000000000000000061 1 1 0.000000000000000061 0 398.268463 cm --322.707 219.727 m -319.965 216.984 l -329.559 219.727 l -319.965 -222.465 l -322.707 219.727 l h --322.707 219.727 m S Q -Q -showpage -%%Trailer -count op_count sub {pop} repeat -countdictstack dict_count sub {end} repeat -cairo_eps_state restore -%%EOF diff --git a/docs/figs/methodology.pdf b/docs/figs/methodology.pdf deleted file mode 100644 index 10292af0..00000000 Binary files a/docs/figs/methodology.pdf and /dev/null differ diff --git a/docs/figs/methodology.svg b/docs/figs/methodology.svg deleted file mode 100644 index 0bce61b0..00000000 --- a/docs/figs/methodology.svg +++ /dev/null @@ -1,1053 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - Memory Compiler(Python) - - - - - - - - - - - - - - - - - - - - - - - - - Logical - LEF/FRAMGDSII - Liberty (.lib) - Spice/LVSVerilog - Front-EndPhysical - EstimatedTiming/Power - - Memory Characterizer(Python) - - Simulator(e.g. ngspice, spectre) - - Extractor(e.g. Calibre) - AnnotatedTiming/Power - Liberty (.lib)Spice - - - - - - - Memory Characterizer(Python) - - - - Back-EndMethodology - Front-EndMethodology - - Simulator(e.g. ngspice, spectre) - - - - - - - - TechLibrary - - - User Specification(word size, memory size, aspect ratio, etc. - - - - diff --git a/docs/figs/ms_flop_schem.pdf b/docs/figs/ms_flop_schem.pdf deleted file mode 100644 index 94c63ccd..00000000 Binary files a/docs/figs/ms_flop_schem.pdf and /dev/null differ diff --git a/docs/figs/ms_flop_schem.svg b/docs/figs/ms_flop_schem.svg deleted file mode 100644 index e4518ed9..00000000 --- a/docs/figs/ms_flop_schem.svg +++ /dev/null @@ -1,1562 +0,0 @@ - - - -image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Sheet.39 - - Sheet.36 - - Sheet.13 - - - - Sheet.23 - - - - Sheet.27 - - - - Sheet.30 - - - - Sheet.31 - - - - Sheet.32 - - - - - Sheet.37 - - - - Sheet.38 - - - - Sheet.40 - - Sheet.41 - - Sheet.42 - - - - Sheet.43 - - - - Sheet.44 - - - - Sheet.45 - - - - Sheet.46 - - - - Sheet.47 - - - - - Sheet.48 - - - - Sheet.49 - - - - Sheet.50 - - Sheet.51 - - Sheet.52 - - - - Sheet.53 - - - - Sheet.54 - - - - Sheet.55 - - - - Sheet.56 - - - - Sheet.57 - - - - - Sheet.58 - - - - Sheet.59 - - - - Sheet.35 - - Sheet.33 - - - - Sheet.34 - - - - Sheet.60 - - Sheet.61 - - - - Sheet.62 - - - - Sheet.64 - - Sheet.65 - - Sheet.66 - - - - Sheet.67 - - - - - Sheet.68 - - Sheet.69 - - - - Sheet.70 - - - - - Sheet.63 - - Sheet.71 - - - - Sheet.72 - - - - Sheet.73 - - Sheet.74 - - Sheet.75 - - - - Sheet.76 - - - - Sheet.77 - - - - Sheet.78 - - - - Sheet.79 - - - - Sheet.80 - - - - - Sheet.81 - - - - Sheet.82 - - - - Sheet.83 - - - Sheet.84 - - - Sheet.85 - - - Sheet.86 - - - Sheet.87 - - - Sheet.89 - - - Sheet.90 - - - Sheet.91 - - - Sheet.88 - - - Sheet.92 - - - Sheet.93 - - - Sheet.94 - - - Sheet.95 - - - Sheet.101 - - - Sheet.102 - - - Sheet.103 - - - Sheet.108 - Data - - - - Data - - Sheet.110 - Q - - - - Q - - Sheet.111 - Clk - - - - Clk - - Sheet.112 - Clk - - - - Clk - - Sheet.113 - Clk - - - - Clk - - Sheet.114 - Clk - - - - Clk - - Sheet.117 - - Sheet.115 - - - - Sheet.116 - Clk - - - - Clk - - - Sheet.118 - - Sheet.119 - - - - Sheet.120 - Clk - - - - Clk - - - Sheet.121 - - Sheet.122 - - - - Sheet.123 - Clk - - - - Clk - - - Sheet.124 - - Sheet.125 - - - - Sheet.126 - Clk - - - - Clk - - - \ No newline at end of file diff --git a/docs/figs/nand_decoder_schem.pdf b/docs/figs/nand_decoder_schem.pdf deleted file mode 100644 index f2e7eff5..00000000 Binary files a/docs/figs/nand_decoder_schem.pdf and /dev/null differ diff --git a/docs/figs/nand_decoder_schem.svg b/docs/figs/nand_decoder_schem.svg deleted file mode 100644 index cbde82e3..00000000 --- a/docs/figs/nand_decoder_schem.svg +++ /dev/null @@ -1,909 +0,0 @@ - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - A0 - A0_bar - A1 - A1_bar - PCLK - VDD - VDD - VDD - VDD - WL3 - WL2 - WL1 - WL0 - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/figs/nor2.pdf b/docs/figs/nor2.pdf deleted file mode 100644 index 1895f236..00000000 Binary files a/docs/figs/nor2.pdf and /dev/null differ diff --git a/docs/figs/overall_flow.pdf b/docs/figs/overall_flow.pdf deleted file mode 100644 index 340737ea..00000000 Binary files a/docs/figs/overall_flow.pdf and /dev/null differ diff --git a/docs/figs/overview.dia b/docs/figs/overview.dia deleted file mode 100644 index a79e3138..00000000 Binary files a/docs/figs/overview.dia and /dev/null differ diff --git a/docs/figs/overview.png b/docs/figs/overview.png deleted file mode 100644 index fc5780bf..00000000 Binary files a/docs/figs/overview.png and /dev/null differ diff --git a/docs/figs/pinv.pdf b/docs/figs/pinv.pdf deleted file mode 100644 index bd725e8a..00000000 Binary files a/docs/figs/pinv.pdf and /dev/null differ diff --git a/docs/figs/precharge_schem.pdf b/docs/figs/precharge_schem.pdf deleted file mode 100644 index f79363a5..00000000 Binary files a/docs/figs/precharge_schem.pdf and /dev/null differ diff --git a/docs/figs/precharge_schem.svg b/docs/figs/precharge_schem.svg deleted file mode 100644 index 1ad9f6d8..00000000 --- a/docs/figs/precharge_schem.svg +++ /dev/null @@ -1,311 +0,0 @@ - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - bl - br - vdd - - - - - - en - M1 - M2 - M3 - - - - diff --git a/docs/figs/ptx.pdf b/docs/figs/ptx.pdf deleted file mode 100644 index f5ad721c..00000000 Binary files a/docs/figs/ptx.pdf and /dev/null differ diff --git a/docs/figs/ptx.svg b/docs/figs/ptx.svg deleted file mode 100644 index 9bba115f..00000000 --- a/docs/figs/ptx.svg +++ /dev/null @@ -1,1557 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - Finger Number 3 - - - - - width = tech.drc["minwidth_tx"] - - diff --git a/docs/figs/replica_bitline.pdf b/docs/figs/replica_bitline.pdf deleted file mode 100644 index af396c4c..00000000 Binary files a/docs/figs/replica_bitline.pdf and /dev/null differ diff --git a/docs/figs/replica_cell.pdf b/docs/figs/replica_cell.pdf deleted file mode 100644 index 7ae362bf..00000000 Binary files a/docs/figs/replica_cell.pdf and /dev/null differ diff --git a/docs/figs/sense_amp_schem.pdf b/docs/figs/sense_amp_schem.pdf deleted file mode 100644 index 01c202be..00000000 Binary files a/docs/figs/sense_amp_schem.pdf and /dev/null differ diff --git a/docs/figs/sense_amp_schem.svg b/docs/figs/sense_amp_schem.svg deleted file mode 100644 index 946aac45..00000000 --- a/docs/figs/sense_amp_schem.svg +++ /dev/null @@ -1,113 +0,0 @@ - - - - Produced by OmniGraffle 7.6.1 - 2018-11-16 00:52:28 +0000 - - - - - - - - - - - - - - - - - - - - Canvas 1 - - - Layer 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - vdd - - - DA - T - A - - - br - - - bl - - - en - - - en - - - en - - - - - - - - - - - - - - - - - - - - diff --git a/docs/figs/sram_architecture.svg b/docs/figs/sram_architecture.svg deleted file mode 100644 index f3b52a3a..00000000 --- a/docs/figs/sram_architecture.svg +++ /dev/null @@ -1,679 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - Precharge - Array - - Sense Amp - - - - - Address - Bit LinesBL0,BR0, BL1, BR1, ... BLj BRj - - Word Lines W0, W1, ..., Wlog(n) - - - - A0, A1, ... An - A0, A1, ... Ak - Sclk - - - Bit LinesBL0,BR0, BL1, BR1, ... BLj BRj - Bit LinesBL0,BR0, BL1, BR1, ... BLj/2^k BRj/2^k - - Pclk - D0, D1, ..., Dj/2^k - - - Address Decoder - - - - Column Mux - - - - Write Driver - - - Enable, Data in - Bit LinesBL0 ,BR0, BL1, BR1, ... BLj/2^k BRj /2^k - - - - - Data - - diff --git a/docs/figs/sram_overview.eps b/docs/figs/sram_overview.eps deleted file mode 100644 index 52e66eec..00000000 --- a/docs/figs/sram_overview.eps +++ /dev/null @@ -1,3128 +0,0 @@ -%!PS-Adobe-3.0 EPSF-3.0 -%%Creator: cairo 1.8.8 (http://cairographics.org) -%%CreationDate: Mon Jul 26 11:00:08 2010 -%%Pages: 1 -%%BoundingBox: 0 0 944 450 -%%DocumentData: Clean7Bit -%%LanguageLevel: 2 -%%EndComments -%%BeginProlog -/cairo_eps_state save def -/dict_count countdictstack def -/op_count count 1 sub def -userdict begin -/q { gsave } bind def -/Q { grestore } bind def -/cm { 6 array astore concat } bind def -/w { setlinewidth } bind def -/J { setlinecap } bind def -/j { setlinejoin } bind def -/M { setmiterlimit } bind def -/d { setdash } bind def -/m { moveto } bind def -/l { lineto } bind def -/c { curveto } bind def -/h { closepath } bind def -/re { exch dup neg 3 1 roll 5 3 roll moveto 0 rlineto - 0 exch rlineto 0 rlineto closepath } bind def -/S { stroke } bind def -/f { fill } bind def -/f* { eofill } bind def -/B { fill stroke } bind def -/B* { eofill stroke } bind def -/n { newpath } bind def -/W { clip } bind def -/W* { eoclip } bind def -/BT { } bind def -/ET { } bind def -/pdfmark where { pop globaldict /?pdfmark /exec load put } - { globaldict begin /?pdfmark /pop load def /pdfmark - /cleartomark load def end } ifelse -/BDC { mark 3 1 roll /BDC pdfmark } bind def -/EMC { mark /EMC pdfmark } bind def -/cairo_store_point { /cairo_point_y exch def /cairo_point_x exch def } def -/Tj { show currentpoint cairo_store_point } bind def -/TJ { - { - dup - type /stringtype eq - { show } { -0.001 mul 0 cairo_font_matrix dtransform rmoveto } ifelse - } forall - currentpoint cairo_store_point -} bind def -/cairo_selectfont { cairo_font_matrix aload pop pop pop 0 0 6 array astore - cairo_font exch selectfont cairo_point_x cairo_point_y moveto } bind def -/Tf { pop /cairo_font exch def /cairo_font_matrix where - { pop cairo_selectfont } if } bind def -/Td { matrix translate cairo_font_matrix matrix concatmatrix dup - /cairo_font_matrix exch def dup 4 get exch 5 get cairo_store_point - /cairo_font where { pop cairo_selectfont } if } bind def -/Tm { 2 copy 8 2 roll 6 array astore /cairo_font_matrix exch def - cairo_store_point /cairo_font where { pop cairo_selectfont } if } bind def -/g { setgray } bind def -/rg { setrgbcolor } bind def -/d1 { setcachedevice } bind def -%%EndProlog -11 dict begin -/FontType 42 def -/FontName /f-0-0 def -/PaintType 0 def -/FontMatrix [ 1 0 0 1 0 0 ] def -/FontBBox [ 0 0 0 0 ] def -/Encoding 256 array def -0 1 255 { Encoding exch /.notdef put } for -Encoding 1 /uni0050 put -Encoding 2 /uni0072 put -Encoding 3 /uni0065 put -Encoding 4 /uni0063 put -Encoding 5 /uni0068 put -Encoding 6 /uni0061 put -Encoding 7 /uni0067 put -Encoding 8 /uni0044 put -Encoding 9 /uni006F put -Encoding 10 /uni0064 put -Encoding 11 /uni0043 put -Encoding 12 /uni006C put -Encoding 13 /uni0075 put -Encoding 14 /uni006D put -Encoding 15 /uni006E put -Encoding 16 /uni0020 put -Encoding 17 /uni004D put -Encoding 18 /uni0078 put -Encoding 19 /uni0057 put -Encoding 20 /uni004C put -Encoding 21 /uni0069 put -Encoding 22 /uni0076 put -Encoding 23 /uni0055 put -Encoding 24 /uni0070 put -Encoding 25 /uni0041 put -Encoding 26 /uni0073 put -Encoding 27 /uni0077 put -Encoding 28 /uni0074 put -Encoding 29 /uni0053 put -Encoding 30 /uni0036 put -Encoding 31 /uni0054 put -Encoding 32 /uni0049 put -Encoding 33 /uni002F put -Encoding 34 /uni004F put -/CharStrings 35 dict dup begin -/.notdef 0 def -/uni0050 1 def -/uni0072 2 def -/uni0065 3 def -/uni0063 4 def -/uni0068 5 def -/uni0061 6 def -/uni0067 7 def -/uni0044 8 def -/uni006F 9 def -/uni0064 10 def -/uni0043 11 def -/uni006C 12 def -/uni0075 13 def -/uni006D 14 def -/uni006E 15 def -/uni0020 16 def -/uni004D 17 def -/uni0078 18 def -/uni0057 19 def -/uni004C 20 def -/uni0069 21 def -/uni0076 22 def -/uni0055 23 def -/uni0070 24 def -/uni0041 25 def -/uni0073 26 def -/uni0077 27 def -/uni0074 28 def -/uni0053 29 def -/uni0036 30 def -/uni0054 31 def -/uni0049 32 def -/uni002F 33 def -/uni004F 34 def -end readonly def -/sfnts [ -<00010000000a008000030020636d61700156f213000019c40000008463767420ffd31d390000 -1a48000001fc6670676de7b4f1c400001c440000008b676c7966097c82ed000000ac00001918 -68656164dd84a2d000001cd000000036686865611045078600001d0800000024686d7478a954 -114500001d2c0000008c6c6f636166f86ce600001db8000000486d617870045e063a00001e00 -00000020707265703b07f10000001e200000056800020066fe96046605a400030007001a400c -04fb0006fb0108057f0204002fc4d4ec310010d4ecd4ec301311211125211121660400fc7303 -1bfce5fe96070ef8f2720629000200c90000048d05d500080013003a40180195100095098112 -100a0802040005190d3f11001c09041410fcec32fcec11173931002ff4ecd4ec30400b0f151f -153f155f15af1505015d011133323635342623252132041514042b0111230193fe8d9a9a8dfe -3801c8fb0101fefffbfeca052ffdcf92878692a6e3dbdde2fda8000100ba0000034a047b0011 -00304014060b0700110b03870eb809bc070a06080008461210fcc4ec3231002fe4f4ecc4d4cc -11123930b450139f1302015d012e012322061511231133153e0133321617034a1f492c9ca7b9 -b93aba85132e1c03b41211cbbefdb20460ae66630505000000020071ffe3047f047b0014001b -00704024001501098608880515a90105b90c01bb18b912b80c8c1c1b1502081508004b02120f -451c10fcecf4ecc4111239310010e4f4ece410ee10ee10f4ee1112393040293f1d701da01dd0 -1df01d053f003f013f023f153f1b052c072f082f092c0a6f006f016f026f156f1b095d71015d -0115211e0133323637150e01232000111000333200072e0123220607047ffcb20ccdb76ac762 -63d06bfef4fec70129fce20107b802a5889ab90e025e5abec73434ae2a2c0138010a01130143 -feddc497b4ae9e0000010071ffe303e7047b0019003f401b00860188040e860d880ab91104b9 -17b8118c1a07120d004814451a10fce432ec310010e4f4ec10fef4ee10f5ee30400b0f1b101b -801b901ba01b05015d01152e0123220615141633323637150e0123220011100021321603e74e -9d50b3c6c6b3509d4e4da55dfdfed6012d010655a20435ac2b2be3cdcde32b2baa2424013e01 -0e0112013a230000000100ba000004640614001300344019030900030e0106870e11b80c970a -010208004e0d09080b461410fcec32f4ec31002f3cecf4c4ec1112173930b2601501015d0111 -231134262322061511231133113e013332160464b87c7c95acb9b942b375c1c602a4fd5c029e -9f9ebea4fd870614fd9e6564ef000002007bffe3042d047b000a002500bc4027191f0b17090e -00a91706b90e1120861fba1cb923b8118c170c001703180d09080b1f030814452610fcecccd4 -ec323211393931002fc4e4f4fcf4ec10c6ee10ee11391139123930406e301d301e301f302030 -2130223f27401d401e401f402040214022501d501e501f50205021502250277027851d871e87 -1f8720872185229027a027f0271e301e301f30203021401e401f40204021501e501f50205021 -601e601f60206021701e701f70207021801e801f80208021185d015d0122061514163332363d -01371123350e01232226353436332135342623220607353e0133321602bedfac816f99b9b8b8 -3fbc88accbfdfb0102a79760b65465be5af3f00233667b6273d9b4294cfd81aa6661c1a2bdc0 -127f8b2e2eaa2727fc0000020071fe56045a047b000b0028004a4023190c1d0912861316b90f -03b92623b827bc09b90fbd1a1d261900080c4706121220452910fcc4ecf4ec323231002fc4e4 -ece4f4c4ec10fed5ee1112393930b6602a802aa02a03015d0134262322061514163332361710 -0221222627351e013332363d010e0123220211101233321617353303a2a59594a5a59495a5b8 -fefefa61ac51519e52b5b439b27ccefcfcce7cb239b8023dc8dcdcc8c7dcdcebfee2fee91d1e -b32c2abdbf5b6362013a01030104013a6263aa00000200c9000005b005d500080011002e4015 -009509810195100802100a0005190d32001c09041210fcecf4ec113939393931002fecf4ec30 -b2601301015d0111332000111000212521200011100029010193f40135011ffee1fecbfe4201 -9f01b20196fe68fe50fe61052ffb770118012e012c0117a6fe97fe80fe7efe96000000020071 -ffe30475047b000b0017004a401306b91200b90cb8128c1809120f51031215451810fcecf4ec -310010e4f4ec10ee3040233f197b007b067f077f087f097f0a7f0b7b0c7f0d7f0e7f0f7f107f -117b12a019f01911015d012206151416333236353426273200111000232200111000027394ac -ab9593acac93f00112feeef0f1feef011103dfe7c9c9e7e8c8c7e99cfec8feecfeedfec70139 -011301140138000000020071ffe3045a06140010001c003840191ab9000e14b905088c0eb801 -970317040008024711120b451d10fcecf4ec323231002fece4f4c4ec10c4ee30b6601e801ea0 -1e03015d0111331123350e0123220211101233321601141633323635342623220603a2b8b83a -b17ccbffffcb7cb1fdc7a79292a8a89292a703b6025ef9eca86461014401080108014461fe15 -cbe7e7cbcbe7e70000010073ffe3052705f000190036401a0da10eae0a951101a100ae049517 -91118c1a07190d003014101a10fcec32ec310010e4f4ecf4ec10eef6ee30b40f1b1f1b02015d -01152e0123200011100021323637150e01232000111000213216052766e782ff00fef0011001 -0082e7666aed84feadfe7a0186015386ed0562d55f5efec7fed8fed9fec75e5fd34848019f01 -670168019f470000000100c100000179061400030022b7009702010800460410fcec31002fec -30400d10054005500560057005f00506015d13331123c1b8b80614f9ec00000100aeffe30458 -0460001300364019030900030e0106870e118c0a01bc0c0d09080b4e020800461410fcecf4ec -3231002fe432f4c4ec1112173930b46015cf1502015d1311331114163332363511331123350e -01232226aeb87c7c95adb8b843b175c1c801ba02a6fd619f9fbea4027bfba0ac6663f0000001 -00ba0000071d047b0022005a4026061209180f00061d07150c871d2003b81bbc19100700110f -0808065011080f501c18081a462310fcec32fcfcfcec11123931002f3c3ce4f43cc4ec321112 -17393040133024502470249024a024a024bf24df24ff2409015d013e01333216151123113426 -2322061511231134262322061511231133153e01333216042945c082afbeb972758fa6b97277 -8da6b9b93fb0797aab03897c76f5e2fd5c029ea19cbea4fd87029ea29bbfa3fd870460ae6762 -7c000000000100ba00000464047b001300364019030900030e0106870e11b80cbc0a01020800 -4e0d09080b461410fcec32f4ec31002f3ce4f4c4ec1112173930b46015cf1502015d01112311 -34262322061511231133153e013332160464b87c7c95acb9b942b375c1c602a4fd5c029e9f9e -bea4fd870460ae6564ef000100c90000061f05d5000c00bf4034031107080702110102080807 -02110302090a0901110a0a09420a070203080300af080b050908030201050a061c043e0a1c00 -040d10fcecfcec11173931002f3cc4ec32111739304b5358071005ed071008ed071008ed0710 -05ed5922b2700e01015d405603070f080f09020a15021407130a260226072007260a200a3407 -350a69027c027b07790a80028207820a90021604010b0313011b0323012c032708280934013c -035608590965086a097608790981018d0395019b03145d005d13210901211123110123011123 -c9012d017d017f012dc5fe7fcbfe7fc405d5fc0803f8fa2b051ffc000400fae100000001003b -000004790460000b015a40460511060706041103040707060411050401020103110202010b11 -0001000a11090a0101000a110b0a0708070911080807420a070401040800bf05020a07040104 -08000208060c10d4c4d4c411173931002f3cec321739304b5358071005ed071008ed071008ed -071005ed071005ed071008ed071008ed071005ed5922014bb00a544bb00f545b4bb010545b4b -b011545b58bd000cffc00001000c000c00403811373859014bb0145458bd000c00400001000c -000cffc0381137385940980a04040a1a04150a260a3d04310a55045707580a660a76017a0476 -07740a8d04820a99049f049707920a900aa601a904af04a507a30aa00a1c0a03040505090a0b -1a03150515091a0b2903260525092a0b200d3a013903370534073609390b300d490346054509 -4a0b400d590056015902590357055606590756085609590b500d6f0d78017f0d9b019407ab01 -a407b00dcf0ddf0dff0d2f5d005d09022309012309013309010464fe6b01aad9febafebad901 -b3fe72d9012901290460fddffdc101b8fe48024a0216fe71018f000000010044000007a605d5 -000c017b4049051a0605090a09041a0a09031a0a0b0a021a01020b0b0a061107080705110405 -080807021103020c000c011100000c420a050203060300af0b080c0b0a09080605040302010b -07000d10d4cc173931002f3cec32321739304b5358071005ed071008ed071008ed071005ed07 -1008ed071005ed0705ed071008ed5922b2000e01015d40f206020605020a000a000a120a2805 -240a200a3e023e05340a300a4c024d05420a400a59026a026b05670a600a7b027f027c057f05 -800a960295051d070009020803000406050005000601070408000807090009040a0a0c000e1a -0315041508190c100e200421052006200720082309240a250b200e200e3c023a033504330530 -083609390b3f0c300e460046014a0240044505400542064207420840084009440a4d0c400e40 -0e58025608590c500e66026703610462056006600760086409640a640b770076017b02780377 -0474057906790777087008780c7f0c7f0e860287038804890585098a0b8f0e97049f0eaf0e5b -5d005d1333090133090133012309012344cc013a0139e3013a0139cdfe89fefec5fec2fe05d5 -fb1204eefb1204eefa2b0510faf00000000100c90000046a05d500050025400c029500810401 -1c033a00040610fcecec31002fe4ec304009300750078003800404015d133311211521c9ca02 -d7fc5f05d5fad5aa000200c100000179061400030007002b400e06be04b100bc020501080400 -460810fc3cec3231002fe4fcec30400b1009400950096009700905015d1333112311331523c1 -b8b8b8b80460fba00614e9000001003d0000047f046000060112402703110405040211010205 -050402110302060006011100000642020300bf0506050302010504000710d4c4173931002fec -3239304b5358071005ed071008ed071008ed071005ed5922014bb00a5458bd0007ffc0000100 -07000700403811373859014bb014544bb015545b58bd00070040000100070007ffc038113738 -59408e48026a027b027f02860280029102a402080600060109030904150015011a031a042600 -2601290329042008350035013a033a0430084600460149034904460548064008560056015903 -590450086600660169036904670568066008750074017b037b0475057a068500850189038904 -890586069600960197029a03980498059706a805a706b008c008df08ff083e5d005d13330901 -3301233dc3015e015ec3fe5cfa0460fc5403acfba0000000000100b2ffe3052905d50011004b -40160802110b0005950e8c09008112081c0a38011c00411210fcecfcec310010e432f4ec1139 -39393930014bb0105458bd00120040000100120012ffc03811373859b61f138f139f13035d13 -3311141633323635113311100021200011b2cbaec3c2aecbfedffee6fee5fedf05d5fc75f0d3 -d3f0038bfc5cfedcfed6012a01240000000200bafe5604a4047b0010001c003e401b1ab9000e -14b90508b80e8c01bd03bc1d11120b471704000802461d10fcec3232f4ec310010e4e4e4f4c4 -ec10c4ee304009601e801ea01ee01e04015d2511231133153e01333212111002232226013426 -2322061514163332360173b9b93ab17bccffffcc7bb10238a79292a7a79292a7a8fdae060aaa -6461febcfef8fef8febc6101ebcbe7e7cbcbe7e7000200100000056805d50002000a00ba4041 -00110100040504021105050401110a030a0011020003030a0711050406110505040911030a08 -110a030a4200030795010381090509080706040302010009050a0b10d4c4173931002f3ce4d4 -ec1239304b5358071005ed0705ed071005ed0705ed071008ed071005ed071005ed071008ed59 -22b2200c01015d403a0f005800760070008c000507010802060309041601190256015802500c -67016802780176027c0372047707780887018802800c980299039604175d005d090121013301 -230321032302bcfeee0225fe7be50239d288fd5f88d5050efd1903aefa2b017ffe8100000001 -006fffe303c7047b002700e7403c0d0c020e0b531f1e080902070a531e1f1e420a0b1e1f0415 -00860189041486158918b91104b925b8118c281e0a0b1f1b0700521b080e07081422452810fc -c4ecd4ece4111239393939310010e4f4ec10fef5ee10f5ee121739304b535807100eed111739 -070eed1117395922b2002701015d406d1c0a1c0b1c0c2e092c0a2c0b2c0c3b093b0a3b0b3b0c -0b200020012402280a280b2a132f142f152a16281e281f292029212427860a860b860c860d12 -000000010202060a060b030c030d030e030f03100319031a031b031c041d09272f293f295f29 -7f2980299029a029f029185d005d7101152e012322061514161f011e0115140623222627351e -013332363534262f012e01353436333216038b4ea85a898962943fc4a5f7d85ac36c66c66182 -8c65ab40ab98e0ce66b4043fae282854544049210e2a99899cb62323be353559514b50250f24 -95829eac1e00000000010056000006350460000c0201404905550605090a0904550a0903550a -0b0a025501020b0b0a061107080705110405080807021103020c000c011100000c420a050203 -060300bf0b080c0b0a09080605040302010b07000d10d4cc173931002f3cec32321739304b53 -58071005ed071008ed071008ed071005ed071008ed071005ed0705ed071008ed5922014bb00a -544bb011545b4bb012545b4bb013545b4bb00b545b58bd000dffc00001000d000d0040381137 -3859014bb00c544bb00d545b4bb010545b58bd000d00400001000d000dffc0381137385940ff -050216021605220a350a49024905460a400a5b025b05550a500a6e026e05660a79027f027905 -7f05870299029805940abc02bc05ce02c703cf051d0502090306040b050a080b09040b050c15 -02190316041a051b081b09140b150c2500250123022703210425052206220725082709240a21 -0b230c390336043608390c300e460248034604400442054006400740084409440a440b400e40 -0e560056015602500451055206520750085309540a550b6300640165026a0365046a056a066a -076e09610b670c6f0e7500750179027d0378047d057a067f067a077f07780879097f097b0a76 -0b7d0c870288058f0e97009701940293039c049b05980698079908402f960c9f0ea600a601a4 -02a403ab04ab05a906a907ab08a40caf0eb502b103bd04bb05b809bf0ec402c303cc04ca0579 -5d005d13331b01331b013301230b012356b8e6e5d9e6e5b8fedbd9f1f2d90460fc96036afc96 -036afba00396fc6a000000010037000002f2059e0013003840190e05080f03a9001101bc0887 -0a0b08090204000810120e461410fc3cc4fc3cc432393931002fecf43cc4ec3211393930b2af -1501015d01112115211114163b01152322263511233533110177017bfe854b73bdbdd5a28787 -059efec28ffda0894e9a9fd202608f013e00000000010087ffe304a205f00027007e403c0d0c -020e0b021e1f1e080902070a021f1f1e420a0b1e1f0415010015a11494189511049500942591 -118c281e0a0b1f1b0700221b190e2d071914222810dcc4ecfcece4111239393939310010e4f4 -e4ec10eef6ee10c6111739304b535807100eed11173907100eed1117395922b20f2901015db6 -1f292f294f29035d01152e012322061514161f011e0115140421222627351e01333236353426 -2f012e01353424333216044873cc5fa5b377a67ae2d7feddfee76aef807bec72adbc879a7be2 -ca0117f569da05a4c53736807663651f192bd9b6d9e0302fd04546887e6e7c1f182dc0abc6e4 -26000002008fffe3049605f0000b0024005840241306000d860c00a01606a01c16a510a00c89 -22911c8c250c22091c191e131c03211f1b2510fcececf4ece4310010e4f4e4fce410ee10ee10 -ee111239304014cb00cb01cd02cd03cd04cb05cb0607a41eb21e025d015d0122061514163332 -3635342601152e01232202033e0133320015140023200011100021321602a4889f9f88889f9f -01094c9b4cc8d30f3bb26be10105fef0e2fefdfeee0150011b4c9b033bbaa2a1bbbba1a2ba02 -79b82426fef2feef575dfeefebe6feea018d0179016201a51e0000000001fffa000004e905d5 -0007004a400e0602950081040140031c0040050810d4e4fce431002ff4ec3230014bb00a5458 -bd00080040000100080008ffc03811373859401300091f00100110021f071009400970099f09 -095d03211521112311210604effdeecbfdee05d5aafad5052b00000100c90000019305d50003 -0039b700af02011c00040410fcec31002fec30014bb0105458bd0004ffc00001000400040040 -3811373859400d30054005500560058f059f05065d13331123c9caca05d5fa2b000000010000 -ff4202b205d50003002d4014001a010201021a03000342029f008104020001032fc439393100 -10f4ec304b5358071005ed071005ed5922013301230208aafdf8aa05d5f96d00000000020073 -ffe305d905f0000b00170023401306951200950c91128c1809190f33031915101810fcecfcec -310010e4f4ec10ee300122001110003332001110002720001110002120001110000327dcfefd -0103dcdc0101feffdc013a0178fe88fec6fec5fe870179054cfeb8fee5fee6feb80148011a01 -1b0148a4fe5bfe9efe9ffe5b01a40162016201a5000000000002000300000000001400010000 -000000340004002000000004000400010000f022ffff0000f000ffff10000001000000000006 -00500000000000230000000100020003000400050006000700080009000a000b000c000d000e -000f0010001100120013001400150016001700180019001a001b001c001d001e001f00200021 -0022013500b800cb00cb00c100aa009c01a600b800660000007100cb00a002b20085007500b8 -00c301cb0189022d00cb00a600f000d300aa008700cb03aa0400014a003300cb000000d90502 -00f4015400b4009c01390114013907060400044e04b4045204b804e704cd0037047304cd0460 -0473013303a2055605a60556053903c5021200c9001f00b801df007300ba03e9033303bc0444 -040e00df03cd03aa00e503aa0404000000cb008f00a4007b00b80014016f007f027b0252008f -00c705cd009a009a006f00cb00cd019e01d300f000ba018300d5009803040248009e01d500c1 -00cb00f600830354027f00000333026600d300c700a400cd008f009a0073040005d5010a00fe -022b00a400b4009c00000062009c0000001d032d05d505d505d505f0007f007b005400a406b8 -0614072301d300b800cb00a601c301ec069300a000d3035c037103db0185042304a80448008f -0139011401390360008f05d5019a0614072306660179046004600460047b009c000002770460 -01aa00e904600762007b00c5007f027b000000b4025205cd006600bc00660077061000cd013b -01850389008f007b0000001d00cd074a042f009c009c0000077d006f0000006f0335006a006f -007b00ae00b2002d0396008f027b00f600830354063705f6008f009c04e10266008f018d02f6 -00cd03440029006604ee007300001400b6060504030201002c2010b002254964b040515820c8 -59212d2cb002254964b040515820c859212d2c20100720b00050b00d7920b8ffff5058041b05 -59b0051cb0032508b0042523e120b00050b00d7920b8ffff5058041b0559b0051cb0032508e1 -2d2c4b505820b0fd454459212d2cb002254560442d2c4b5358b00225b0022545445921212d2c -45442d00000100000002000039b310185f0f3cf5001f080000000000bab9f0b800000000bac2 -6791fe89fe1d0a4c076d00000008000100000000000000010000076dfe1d00000abcfe89fe89 -0a4c00010000000000000000000000000000002304cd006604d300c9034a00ba04ec00710466 -0071051200ba04e7007b05140071062900c904e500710514007105960073023900c1051200ae -07cb00ba051200ba028b000006e700c904bc003b07e90044047500c9023900c104bc003d05db -00b2051400ba05790010042b006f068b005603230037051400870517008f04e3fffa025c00c9 -02b20000064c0073000000220062009a01040150018c0222028602c60318036403b003ce040a -046c04a804a8052605f406d206f4071c07ba0802085008ca097a0a980ad60b520bbe0bf60c20 -0c460c8c000100000023004d000700420004000200100040000700000415056800030001b802 -8040fffbfe03fa1403f92503f83203f79603f60e03f5fe03f4fe03f32503f20e03f19603f025 -03ef8a4105effe03ee9603ed9603ecfa03ebfa03eafe03e93a03e84203e7fe03e63203e5e453 -05e59603e48a4105e45303e3e22f05e3fa03e22f03e1fe03e0fe03df3203de1403dd9603dcfe -03db1203da7d03d9bb03d8fe03d68a4105d67d03d5d44705d57d03d44703d3d21b05d3fe03d2 -1b03d1fe03d0fe03cffe03cefe03cd9603cccb1e05ccfe03cb1e03ca3203c9fe03c6851105c6 -1c03c51603c4fe03c3fe03c2fe03c1fe03c0fe03bffe03befe03bdfe03bcfe03bbfe03ba1103 -b9862505b9fe03b8b7bb05b8fe03b7b65d05b7bb03b78004b6b52505b65d40ff03b64004b525 -03b4fe03b39603b2fe03b1fe03b0fe03affe03ae6403ad0e03acab2505ac6403abaa1205ab25 -03aa1203a98a4105a9fa03a8fe03a7fe03a6fe03a51203a4fe03a3a20e05a33203a20e03a164 -03a08a4105a096039ffe039e9d0c059efe039d0c039c9b19059c64039b9a10059b19039a1003 -990a0398fe0397960d0597fe03960d03958a410595960394930e05942803930e0392fa039190 -bb0591fe03908f5d0590bb039080048f8e25058f5d038f40048e25038dfe038c8b2e058cfe03 -8b2e038a8625058a410389880b05891403880b03878625058764038685110586250385110384 -fe038382110583fe0382110381fe0380fe037ffe0340ff7e7d7d057efe037d7d037c64037b54 -15057b25037afe0379fe03780e03770c03760a0375fe0374fa0373fa0372fa0371fa0370fe03 -6ffe036efe036c21036bfe036a1142056a530369fe03687d036711420566fe0365fe0364fe03 -63fe0362fe03613a0360fa035e0c035dfe035bfe035afe0359580a0559fa03580a0357161905 -57320356fe035554150555420354150353011005531803521403514a130551fe03500b034ffe -034e4d10054efe034d10034cfe034b4a13054bfe034a4910054a1303491d0d05491003480d03 -47fe0346960345960344fe0343022d0543fa0342bb03414b0340fe033ffe033e3d12053e1403 -3d3c0f053d12033c3b0d053c40ff0f033b0d033afe0339fe033837140538fa03373610053714 -0336350b05361003350b03341e03330d0332310b0532fe03310b03302f0b05300d032f0b032e -2d09052e10032d09032c32032b2a25052b64032a2912052a2503291203282725052841032725 -0326250b05260f03250b0324fe0323fe03220f03210110052112032064031ffa031e1d0d051e -64031d0d031c1142051cfe031bfa031a42031911420519fe031864031716190517fe03160110 -0516190315fe0314fe0313fe031211420512fe0311022d05114203107d030f64030efe030d0c -16050dfe030c0110050c16030bfe030a100309fe0308022d0508fe0307140306640304011005 -04fe03401503022d0503fe0302011005022d0301100300fe0301b80164858d012b2b2b2b2b2b -2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b -2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b -2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b -2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b -2b2b2b2b2b2b2b002b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b -2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b -2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b -2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b -2b2b2b2b2b2b2b2b2b2b2b2b2b1d00> -] def -FontName currentdict end definefont pop -%%Page: 1 1 -%%BeginPageSetup -%%PageBoundingBox: 0 0 944 450 -%%EndPageSetup -q -0 g -3.2 w -0 J -0 j -[] 0.0 d -4 M q 1 0 0 -1 0 449.799957 cm -205.586 33.855 m 621.078 33.855 l 621.078 277 l 205.586 277 l 205.586 -33.855 l h -205.586 33.855 m S Q -2.4 w -q 1 0 0 -1 0 449.799957 cm -134.273 33.414 m 134.273 277.441 l 96.422 239.59 l 96.422 61.602 l -134.273 33.414 l h -134.273 33.414 m S Q -1.6 w -q 1 0 0 -1 0 449.799957 cm -60.18 146.973 m 96.422 146.973 l S Q -90.02 302.827 m 86.82 299.628 l 98.02 302.827 l 86.82 306.027 l 90.02 -302.827 l h -90.02 302.827 m f* -0.8 w -q -1 0 0 1 0 449.799957 cm --90.02 -146.973 m -86.82 -150.172 l -98.02 -146.973 l -86.82 -143.773 l --90.02 -146.973 l h --90.02 -146.973 m S Q -1.6 w -q 1 0 0 -1 0 449.799957 cm -134.508 54.594 m 621.285 54.594 l S Q -q 1 0 0 -1 0 449.799957 cm -134.508 141.715 m 621.285 141.715 l S Q -q 1 0 0 -1 0 449.799957 cm -134.508 228.836 m 621.285 228.836 l S Q -q 1 0 0 -1 0 449.799957 cm -134.508 83.633 m 621.285 83.633 l S Q -q 1 0 0 -1 0 449.799957 cm -134.508 257.875 m 621.285 257.875 l S Q -2.4 w -q 1 0 0 -1 0 449.799957 cm -348.926 343.105 m 449.551 343.105 l 449.551 361.578 l 348.926 361.578 l -348.926 343.105 l h -348.926 343.105 m S Q -3.2 w -q 1 0 0 -1 0 449.799957 cm -206.719 291.098 m 618.336 291.098 l 547.359 327.414 l 263.613 327.414 l -206.719 291.098 l h -206.719 291.098 m S Q -q 1 0 0 -1 0 449.799957 cm -203.129 1.602 m 619.512 1.602 l 619.512 18.52 l 203.129 18.52 l 203.129 -1.602 l h -203.129 1.602 m S Q -1.55249 w -q 1 0 0 -1 0 449.799957 cm -216.395 18.453 m 216.395 290.867 l S Q -q 1 0 0 -1 0 449.799957 cm -229.27 18.078 m 229.27 290.492 l S Q -1.556427 w -q 1 0 0 -1 0 449.799957 cm -596.594 17.465 m 596.594 291.355 l S Q -q 1 0 0 -1 0 449.799957 cm -609.465 17.09 m 609.465 290.977 l S Q -1.55249 w -q 1 0 0 -1 0 449.799957 cm -408.098 17.027 m 408.098 289.441 l S Q -q 1 0 0 -1 0 449.799957 cm -420.977 16.648 m 420.977 289.066 l S Q -2.487167 w -q 1 0 0 -1 0 449.799957 cm -404.91 132.52 m 425.762 132.52 l 425.762 151.762 l 404.91 151.762 l -404.91 132.52 l h -404.91 132.52 m S Q -1.6 w -q 1 0 0 -1 0 449.799957 cm -359.969 329.41 m 359.969 344.691 l S Q -q 1 0 0 -1 0 449.799957 cm -374.078 329.387 m 374.078 344.668 l S Q -q 1 0 0 -1 0 449.799957 cm -427.621 328.605 m 427.621 343.887 l S Q -q 1 0 0 -1 0 449.799957 cm -441.73 328.582 m 441.73 343.863 l S Q -2.4 w -q 1 0 0 -1 0 449.799957 cm -158.434 32.609 m 179.375 32.609 l 179.375 276.637 l 158.434 276.637 l -158.434 32.609 l h -158.434 32.609 m S Q -BT -16 0 0 16 379.104615 434.102483 Tm -/f-0-0 1 Tf -[<01>17<02>21<03>2<04>1<05>-1<06>-3<02>17<0703>]TJ --20.371625 -1.429849 Td -[<0803>2<04>1<09>1<0a03>2<02>]TJ -ET -q 1 0 0 -1 0 449.799957 cm -348.121 376.93 m 448.746 376.93 l 448.746 395.406 l 348.121 395.406 l -348.121 376.93 l h -348.121 376.93 m S Q -1.6 w -q 1 0 0 -1 0 449.799957 cm -358.359 362.027 m 358.359 377.309 l S Q -q 1 0 0 -1 0 449.799957 cm -372.469 362.008 m 372.469 377.289 l S Q -q 1 0 0 -1 0 449.799957 cm -426.012 361.223 m 426.012 376.504 l S Q -q 1 0 0 -1 0 449.799957 cm -440.117 361.199 m 440.117 376.48 l S Q -BT -16 0 0 16 355.977417 136.594032 Tm -/f-0-0 1 Tf -<0b090c0d0e0f10110d12>Tj -ET -q 1 0 0 -1 0 449.799957 cm -196.895 310.461 m 233.137 310.461 l S Q -226.734 139.339 m 223.535 136.136 l 234.734 139.339 l 223.535 142.538 l -226.734 139.339 l h -226.734 139.339 m f* -0.8 w -q -1 0 0 1 0 449.799957 cm --226.734 -310.461 m -223.535 -313.664 l -234.734 -310.461 l -223.535 --307.262 l -226.734 -310.461 l h --226.734 -310.461 m S Q -BT -16 0 0 16 131.150171 437.189101 Tm -/f-0-0 1 Tf -<1314>Tj -0 -1 Td -[<0802151603>2<02>]TJ --8.204698 -7.355704 Td -[<17181803>1<02>]TJ -0 -1 Td -[<19>18<0a0a02>21<03>2<1a>-1<1a>]TJ -8.140788 -9.532159 Td -[<14>18<09>1<1b>-1<03>2<02>]TJ -0 -1 Td -[<19>18<0a0a02>21<03>2<1a>-1<1a>]TJ -13.840575 -1.667784 Td -[<13>45<02>-1<15>1<1c>-1<03>2<100802>-1<15>1<1603>2<02>]TJ -0.0468323 -2.214767 Td -[<1d>-2<03>2<0f>-1<1a03>1<10190e>2<18>]TJ -ET -0.8 w -q 1 0 0 -1 0 449.799957 cm -676.996 58.477 m 426.332 133.262 l 425.105 152.562 l 676.574 257.215 l S Q -3.2 w -q 1 0 0 -1 0 449.799957 cm -675.879 58.777 m 942.465 58.777 l 942.465 257.715 l 675.879 257.715 l -675.879 58.777 l h -675.879 58.777 m S Q -BT -16 0 0 16 709.534497 402.365834 Tm -/f-0-0 1 Tf -[<1e1f>-3<100b>-1<03>2<0c0c>]TJ -ET -1.6 w -q 1 0 0 -1 0 449.799957 cm -397.629 397.246 m 397.629 433.488 l S Q -397.629 46.155 m 400.828 42.956 l 397.629 54.155 l 394.43 42.956 l -397.629 46.155 l h -397.629 46.155 m f* -0.8 w -q 0.000000000000000061 -1 -1 -0.000000000000000061 0 449.799957 cm -403.645 -397.629 m 406.844 -400.828 l 395.645 -397.629 l 406.844 --394.43 l 403.645 -397.629 l h -403.645 -397.629 m S Q -397.629 22.714 m 394.43 25.913 l 397.629 14.714 l 400.828 25.913 l -397.629 22.714 l h -397.629 22.714 m f* -q -0.000000000000000061 1 1 0.000000000000000061 0 449.799957 cm --427.086 397.629 m -423.887 394.43 l -435.086 397.629 l -423.887 -400.828 l -427.086 397.629 l h --427.086 397.629 m S Q -BT -16 0 0 16 357.241675 1.484389 Tm -/f-0-0 1 Tf -[<0806>-2<1c06>-3<10200f>-1<21>-1<220d>-1<1c>]TJ -ET -1.55249 w -q 1 0 0 -1 0 449.799957 cm -565.953 18.199 m 565.953 290.617 l S Q -q 1 0 0 -1 0 449.799957 cm -578.832 17.824 m 578.832 290.242 l S Q -q 1 0 0 -1 0 449.799957 cm -243.004 19.812 m 243.004 292.227 l S Q -q 1 0 0 -1 0 449.799957 cm -255.879 19.438 m 255.879 291.852 l S Q -Q q -q 0 0 945 450 rectclip -% Fallback Image: x=680, y=61, w=259, h=186 res=300dpi size=2511000 -[ 0.24 0 0 0.24 680 202.799957 ] concat -/DeviceRGB setcolorspace -8 dict dup begin - /ImageType 1 def - /Width 1080 def - /Height 775 def - /BitsPerComponent 8 def - /Decode [ 0 1 0 1 0 1 ] def - /DataSource currentfile /ASCII85Decode filter /LZWDecode filter def - /ImageMatrix [ 1 0 0 -1 0 775 ] def -end -image -J3Vsg3$]7K#D>EP:q1$o*=mro@So+\<\5,H7Uo<*jE<[.O@Wn[3@'nb-^757;Rp>H>q_R=Al - C^cenm@9:1mM9jS"!dTMT<$3[GQ$8#0$s<4ZX!SPQ1`C/mioWjnAY&^gM+`4=1jRLW!YA=M/6)*KS9PE`kN%="Tc - _Aoh+fk'&t\ctIN)4XQLiVpoI(>.nOW?*DmsG$@,,f58"PDKfeXi0S^6MAH=;fBr>1IXb_>k - P+oS^^pnX!PjdJ%0OEX9GI`IODGpB_@VYP$,Ve*/ITH-bV]jIOR,+@`"`Y",ZIn#4SCjj>/e9$(.LU;GSa9RBOG0#GDN?cO-A2#::%$g,Y6@ - "SM2*A9YE5'oPAVt9%.$V8^`j*/PFP,br"q7EP_Aj*tpKE4<6:.a&AJ88Zc!]'l@2hecqCM - C"A$8Ci!/X"a"ifP6F61=;D=s:f/TseRP+M8[i9#2JL'Af7ueC*['#?qeOq$"Mnd)k7*kre - qTTnELQVR^L`mW8\/eFQYk)d?5EKYCfP)T`bO9dJYQ:I`hhj?)u'k;ES<4Ma[Vln9fIdbQu - 3q"iY[\$a4i?-l&3au3R*Q>[gA7ZQh^r)OlV519O-Z_el5r:L)+$,Af!bZREO0hZ('nN\`m - "_-MDjj)FcoD@VD$MAXZ.*XD)KCeF^GBSG,=AWL/"7<*^F)n(=C%:Uc@f\q]C!LX@!4Q\1/[h=%E%]U:DLk=S8*O(99TS`EcRLa - VJ#:cWG5CRK\nr=PJ%8ed?HdC8(3`o:>rpT\ad?qB,S@afuDJE]7"OMQZQ;QRs&1P?mbg@J - ^&LOD]DDKa+N99hJ$3WoVDjel'4H9SlYSSQ:]=:IdaREHl_0Oe4sj]jibaV(,J6E[$.@7p8F+h<]l>b;i5g`ed0rU - b=FMS=>Gi0S3)E#j4VQWK0G>X6.L@N),@\HEMbmA>#RJ'eUB$R<:q>kKO_G]efYD^sTq3RO - #92]VEK3oA3_*-RVjYtU@q1qbYBWD/T4j[FiYX[H;!T:Be;4_,/hTO/W$S,7BnU7BCaesAW - 0.KS=$qLL8_D_MJ7JOTl - ?Nh;'$p<33XW<*/b?diarEUSHRphNgN.P^K - aNTONfSh%AS4C7[`.H3]l)+K*-s&RnXe5j'uW#"%eu8_%WPFV;]]gm`NTc03.J'HJTPDk]Q - RMFLXjZ:>V-KX.^#,dlplUF]FY64T/Q(o7!3,jlE7>[11YZM!*38t'jZ+O$ep*CFs0R8V<8 - 8bq#QQU'Z28`;6r8rZ^577jIY/uBICYa1J.`D05R:5l*d/0oIfX$MWG:E\1D"2KVl7/K@@\Zi0XoiI]WP5.A(,D1?,G-;X$Q;j[g-0dV+T?RW8T`h;6L75r;71j%`L]uY1 - oLW@;V"\:VJ;U&a.ZdRDI*(g!K\1jt#Sql\49;[-Gr$ohDhpY1?e2?#/hY6VV:)I'A:JP25 - o<[oOn=gY236K/LKSU#%@,Lnust;cfV"ec[Aca!oIjUP"4;0V$H=J]Q`fJF>O3>)JNlpI#kFDbc0eG"""$Z\.2$WWW9M+>$tu8 - JS\O1*JoBKUAVTh#!90>nk@6$C30&*@)8"!E]1 - Bbp<%.V+fa$FVb;F(N[f=;MrX.cpb-or[g8].7VU+MXuNY>mjI6GER$j;3X-#Z*OE^!&WnN,$_"*/jP!*sMd[j4q>e - VfUfa>ldiJ[sK;67POTbMS.Ht(A+($e^;FCl`V.@D-Ve&qk1IdTdF^7h!/9kXi7E[PXWog$ - U,)a;>M$ElFB>a?,C?s/_B$Gb-p'/@c>7F0.L$Hc)&='-O;e?4sST+2Ld:AW8=>$[SPa94= - Yg'3($Q,H_XtBY])iPnW>pHnr7[4=,?1TlX@n-dPTM(+^H+'YTkj28[D@HWF5Z-^E/2L^Pm - ueJ[4FKrm!,I[9.^Q:;Ha,Pc&`R%kMK)Ss_CRS?M"Q9Ln_@hAK?edscXjOS[?f;[dT0O%p) - ^mAV2p7A0ac^[+7id`$@0YVh2ZQ#/Tj4hOnq=FZ0cnHXJkCE$fZgih.WWqa[R0N\T^hC;TK - fr+S+H;d;qc4[FNe+ppX\u?&u:7?HdLk!oIb\I_CHlh.K)Lf[!?rPu_mkh:J6s9?MOY1^;n - 6VCo@f*Y3Aqh[Rj+`lnd[lr5X=BU9Bi:.X\nTJiZ=0.#*=SX(/0C#js:?"8);ZVF#Hs%RKG - ^k1/T(3_^J2qU2VZ1_MMg3[1CB@R.e^+ZX#@NJtt3m@GhE.6n,9:4fS,+d>$GOQM&F#pZ9Wn@C"NT9iS.=j7iWEC<%eg[ - 8jhN4L^AYAXCp"TWKJ!3ck`jZm)YcBh4P`f4`]l1C&bb[cI>?Un?mAB\8YVAY<_M+OGR$u! - Q:U^,7;qZ'S!OAH:g<7_G$6L6ulH]>>P - ,pqVLae@MD3Bu.Y)OaEC'P+RnNdjD720`5'VZL=7FZuDd%SU&%E`S>C%RPNU4_\oD?ff7b7 - &UZfPV!ZKC"WM$tosPKEe];`rK`3TX*/ZW2c\OC'E6YNY3Lla^[P20TQ_S&D'Eg8R7^;K"I<8g_JIHmI#"kBB%[8tlEmEH8S#nDjCi1] - /sGLpf+D>Id:.uh*.$c+"(g1WlVejfFXM3T-aJ--jKs.\fRrF#\8JUmarI3K!gcZ\\I)<"l - ghb:ghho#r[?(5l`fcl]%is/#?&5c8X,''fNKa-s/lQK-e=VY\qDC%UBL'[KXa_ZC`m;`s/ - K%o9^iP9YRRW+Tua$W`o`hHJh&Ip=BS[U!(B:k<@Y`U88 - 0@KBMC2-Id0lmYrTga3UIcZV^/,HHSRfR7EugL'D"^\pGhFQ>DS/LdHiLN6I#qdp`TDC&kd - Noe0^r33.e-aejGVdh,#fJHWbs;].VPV)i[s3i#_J7Cm:bY))IWJoN34aeG0%*f\qE_Hq9LCmCmoobb.d[>31>Z-3e=C>gi-$$^)SHX,; - 3MmT_'lJIjNi'JVu)`CtBq9XN#+AKG5l=Cd7TK/(Qj9rnmMU&sg\qB9F+:3G10D]h0^`l?.DWr4Woooc%k/N5^Q\P3pA<+Jq/k]2?8-d\4OD)dZP28eVUf8!:?Iirnp#L9QS48. - P_ZYL&M#(@pqa-$b=s])=[Vok3LLGoqBF<%q#p,Ni`.Dd/d;9Z[$'c-[oU)V&^*WF%"WhCb - fVK*V`#tgklpAJSB*ftkJ^;]%VoYn,MAZd1eHU+i7=\Z58I7$S%27t`9L=hS5#oPB;2#u[; - kTmY"GH#A*sN9LL3-:'UgX\O7b-7-="pT6\4LEh?>"_c"dX]EoNHmY91\b].+3G+!e]d`?U - taepG6tDf'e?*jbEAL8(sC[\E"*6qD9&75iSt_MQo[Go1%+JKhHT?c>RXK&sO7'9(!)4i6c - 8'Las0uLT6R'c>5'4=%&*m%6.Gq8mMZYROi/'O/`GD6QAV;BGV'ujKqk0arfq]7`?EA95I3 - gaA2s(E(6O,,_Teu[=3=2J>p><7@J&5k:)1a>7U(D`JQaq\=cI>H79'd%"*cKm]b:2JCm!$ - V*%p-l>*N5g[LAXCcc*h*p-k4Dl^+78(N&X$R;egWIAF-q3RMb6sQds,L!/udp1ncYU\7g.?K2PUWi#u!(q - )p0_uNu^"hMr/8WLMFo;VT=S:s'rjkBlXc4u> - %f)X."n#)jX<7.bNMG*MIV:sH&lG[>;E)8JGkcCZJ6[CSi)%c?GmhE[=Aub$C::a=FBM=)Z - $m$kGTd=etM0.23IKo[@Tb3C7kG"N'pU,?N[AF.N`P,]U>m"iATFhHH-Ae]JS#Kr;WOginj - r.7?UNccm\=b.Xi'"V.37@!3X+RuW)SUeA_lS1-XR=oH.cmdZJ\,U\9#R$$7t,="7")4Gjt - \#iG#ATgR.Vi$KI:$T"HHTi:`mW9GNZ9b/jRF@)#?->=c>\qklPCL_Ft54^q:)$,fJ4:d2E - 4BI#sN+n3dJN-*0@CUW`ZD.THRu28af$TE`!/m/(9CFE:.PD@"[-7kUH/;8@j)]:<,7H\?L - QM7D<&\P\'kLJtb$\[i":X:)GQR`GJ4bQYT)M]1):>[PT$hFb`OGUIHAaZeJFMg,VZ]f@bQ - )FfYnOT22&:8Nh@Kc_80N?r8`M!ZhR/e[pLpFgWmMb"h*$Of^b9\opo980*En+saG`0'F?@ - Z.`&0^8iB?-mu&@Z%CV7$_1L89HA4EYSWe:iI3mu:HT[&#%"=0n)lZrDR0+!b4/C#MFR#Y3`eS`&4pJa^Fd0XMJhJ^p - =RoAlDg%Y\YZbRE[65"S-.1ZSKt#o'mA)i&XQ?t*8&i5<`r/iV4]f2j]uRa]a8;jW?8LVj4!'cYV8; - nG]p^$34de5^mE*.J"NXame7]:$A8%57.e`9B>0fj'Df&;p7.=FMKR)pF4:$]U#fMPjP'<$ - JVJV2"Y_oNdtaIBBSg - U#!6j7&ld@0Ufr%k&+*#mGlBT!4R"/bKR%_r;3jPYM/mMacYf=SqMR``Ql"Tgo7`i7*41I$(DsR - #>#_m4ePRHDb9&MF/CDKtHd?8bfh@Qm8YsmMoVrp0G?C9b-+4+3P#H%ggK[bemF*k9g>=l7 - %ZV5*1maiVMTHa1Q/>]a&Q-*AIdUHQ=+t/'/^$mdo:jU60P],tW,fRjU - euKVKt@.%1p!4Gja)F3AG%_J@?WCr0W)C12'_9]_5^$ERiu](I*n/;Cj-o:`'D.7QA@?l2i - $M*Dj,!KfYc<$^gEY;4eW2nR/<@2Uam*3Ccn-P?=g^_0TBfF"856Y%=#8>rP4EnMV>0!tcWJVko:?+qgH1AQa1fRqGmtJpU!WCa0@A_ - JqTgi>i.L]5?:YH@W`NcK(+$h"O7clb@%aqZ">T'F"k/T_&^@_'A:^<^EVEeUJm,S1=u10Z - _-@L/@(;%u%7o]+L11.=#aepnfR"-?O=A^:Xt%EGa-jipq*MB22'Ngdl7=^qL>F0:-8GL1? - W`H(m^q9$.:oO#U8[`k9a>[+K)+Fof%i7hQ_4^=]?ZZQ>XcTtd>_.P\W;C*s4lVqWU^LL_V - ?M>ZeGC'Jj'9=ca,TpeGogHlcW#3'-0qe;V/kRI7W]l/8FZbIG!#(XZhb0d3$l7>9r$,)?L - _!bO]Y9V/0I&AL<-HlW9IBTprhS$04Nr3_`$6o5I`iJF=Q?)q:>:86nF#eJO=/G;3?WZDrJ - )Di[#D1n/:)AZDpl6`XGlC)%bb(9W$R*B4.FUn-1c5`:kHXjo.s3B^O2uT2#K-(ZIjQUY\G - Xgl+hUuf%e;"\[oA-YW1/g]b0L]NnUGF-LEX@:)S$r`&mC'=k9ElTdgmT,:#m"?VYAkIg0m - 6uOB)`SQC.qIU#^X_,k4,#oZDsL/:6iO'1-q@$=Qde@jVZ^OLCOB9LDi"aa@m,aDB@0H8m; - XJT8!&N^TRG6\pDhfG^UCJ<1rZ5mSnD+R"]HS`1DP#\ablj?SN`+so_j7P@4$0LQt-k""`Z - E\mA>?,h28;aiBF`q1aRL-k6G"(BUf=%klBZmCYCp-2(C!?bneK92636V)HZdafmN;(6Y#[ - ^@eEdhou3.bRq%iJ;CV@teTr;/N(_R%kopUNOs(s#VWn]]*DpM9G<88jhnYh=O`V&RgD_VB - H`\A?_DZ`NY]ZZOIRYP?,eq?MpOiQ&kcHT5 - XPj.)=!F&%#.3bMAECaY=_7onKb<8h[/AsCjQdpOJ\TU2:&H@He9oWAqiO`X2AVFSb[6="m - 7M%ZM,`3nnE=3OHIZmb'0.&t+X]*aHI3\@Tb]1&\3.r6IrnKljG29!,7'LbP^#[1UXl&^4g - J^0_hg2J"1cuc1?GWgj$J0F1iPVNTi>t1d:GT.):WKfB><;N:fC6__tN6ST*jg,D[i5.)*[ - XJO&'3IXC@p]8nZQJ\g>#5*/%dW%>jR* - gWp/KP?AG`q@0=RpZ-89r6nHHuba5SYj^::,R!dfc^J'CAeo$@usD"oD - [GD3ZddVtF@TQG!i)eW@8+p>9*OJT,KA_j$$=jg=QAE`^YQVh*6IKtEumY)lMlJMQNoHa.^ - F?rFUf?LKSp`HXbXj#04rC<74!N(<8.\WbVlnH8l^)I>;G0U:q_BNa[ltMB@p0\;+MK)ZI` - L++N@e*lVNq6*aGh0(I@-;9VGW<`odiSYhJ-tiY-HL^q,6E7TOF^Lfaahtj".Z'/!gVdU`^ - s:37EFcaL+0hB!`Zd8,jlt->9^Q9`Cjj!8)?.7-R:tH1rZ\Uf%tJnRFaN5I.LD\V81!.:-KfomQ^-6)`O@YcSCa6OIWUtDr.Tgur$GA - A>"-):F2!>_WSQ0rLO;ZVqesTiKpN_=Lh?Yf34:<0o3qdVD=&m7rd2`e=F=uP-H^AgAS_(J - tIdu9Af6ctWpV1qP!T8>AKCGHK_g$YCid=gcnX_\[GlJrJI$^&fSla*\Ikg)5f:2B'GJs,[ - fI[iRZLj$55^ICil>FC-a]nZOks-ht^k]8R+>a9!E#n@jhc0`K:ItSa(MSIlB)$rcj&qDok - ^.9VoA;L:0c&XUN'ZOdK^4WZqrc#k*b=>M"#OB.*VE")9SSD^ge>n*qL;T4rL^RnIfJC)J! - ]d+T@`s@s6q0^+8ZU]?p4ZT!!8Yk!V?FIYS=S4IC.2O]sn5r9F!h1#!K$?J:Vu,Qkhrs+@+ - ,IJuCOllBqbOrP-Pg5I;%h//(<3'L>D-6!P0kC_oBb(dX)u6(AiZX;aI<*'qdh6/3MIllSO - k+@6J[66%19/0dJD,XP0N6 - cilcr"@Gj=J5`R;,CQrRJUn2PX["0aJ1n'A.g-hA6BjZ"36DT4;\b/+Oo+YT_s=B#0J!kl/ - 1WVBlMW8D2)"SgM1Gu"@VUjp2oNo@7,1O*lq^%I:dkdi73#2o/5nu"<(0>,ZBSBBiHm9B+N - !^q!B]2S>MIk7gn`Rk8]lsE36"2K:A^gg'LMc$d!)OH's7;+,=<+e[JBL[qp7\"3_XD: - ;/9=%%"&"PH8Pb9u*,.q,j"'&%[+9c[GYe - KU>:1cQ)LO/Fh$m%a>\p8;IGeFR7>$peQkE:Rq8WXSYf+r(kQ8:YbqFm/Kl[!)O+*:`TU6/ - H\g4"Aher:gF9%D$Nmc#Z-Ke:n7qiXU@t=$rG1X:u)UW_lPoC29#d!9&0%='_>0ao$K"jb+ - rE4>M?I/%ag76Z60fKgN8)=H6KZT$'a6s"-4uPO>tJA^AOB`%3::5Ju";,.>3e7*@Fa5-rQ - $R;Oo:8XXd;_/5j_E;V`s'm3e6OGQIat6LY^g/$QML#!dSK88PES,go<8(.I!`]$mXrM^:; - u%"\M);Y<4Pm6=PJ5ZA1Y<#n;)/ONK#6rZlL<*_smD+@QR85tR?<1QW\X\2X,9N982<8C;K - m8$^[:fRs%GFB - ;1Z=']uND0K'0GZTlM=.OXl_]2"m/MpQf/T<:4!tBgn$5\p^:@'g[V%UqI3P*C-\*R8'J/j - /HL]Z[p.F:"T[>S+_N*+>a=P]!>m>kBJOBE$T=WNZ./X'=#PZ^_G=^@=rD3nCRQs#E:=e2! - aXd`J,S6=+-=l#ZPm@RP[TNVeu=rj>@/Y-"J3S2'k"!sg"Ps!,4W5+nVd0s='`:?O>(;i5f - \(o3K]N@SV&&Qkm0u]nl/WIG'5R`iE)l[]*pm5$Fm*Z"'ZJ?\Tg[IrY[g>VLPY%Mpa]h.:^ - g%>b>TL[d/]1gV`*?$U>[>?S:rj&qe.jB+gmZJQ!&L`"-URF^^#Z.U]O4Z_!QE6a2qrf*c$ - umh.'#lr^V\2(7E:<\`ncX-?(K\TXkR-pgg/1\?/=@CmGD4Ji*HlO?6/$3/`U/#jBbRB?T/_=9Vn)+Z-VD2C%;Jm&:]SU408R(RMA+!C.hU]n@c4!7cV?D`( - j.V:&)L<;HXq+q>&7H%\@3-%i/e_YW'Oa`O@6tnO!Po+/_RNKXN<9]C-6#LXc+9rL^jN9,` - &5^_8ihqM8-7HH9lbniI1lluN)7J3!ZN;k(#k6&@\,&YXt*tq/7QmV@br_HmOr&K0OkSI@i - dC8/i.!$1h09<@pV''DDu'S3+It/A"G_kXug.-4CcZ"A)9CZmQY2^(6l&B*%Ab"G[/A39JW - CQJY#>)bfu4gX[VmQ7K_AOgXd7:G-:V**bpK#.0e+;! - =SV"/ChCt0B&7E;lp@e97u-$k$d+_CV:B"Y,%&>01m<@'I.BOJGs2$pJK,&KA(@Qo2RQ"A- - K?YZeo*$M=3]flc1Y;:Sm,)C03)Dac$Q_-Hn_LTJUAm-u$pgef1j/SFSVo33[?=`J)fI;\5 - go4;r[4B"jTZ5(LRNhU30ki09TsKl4hpVPb2K$3TjV:u#SMZskW: - ph8t?)dKPcBP3P32`iSL?]PGg+CYlcCG&R_<+-\Q"L"Oh@HR_aRe]>A%cQh%B*.T_.0Ip`+ - "FNI&&?Q_j&hD8AV<4],V7Ejb]#ftclGh)E6*QCNka`B@A2C%@4ae-RJjU],C)3=kKUmd>g - aAu8Ukth(g2F+Mdd@V(DB@eT0&mFV]EdscP3Fk9WD40IrtoPR!VA'A,WO6a+2bK*Vn$%^fs - R';K<[W#Uc-NVDHROJ#j&1*D&*KI)H^Ch@Z/p2S&mQp&c/+j_NM>R"TKMRr?o)?hoGun%4O1JZ,[pL_!+'%nm<_aD^TRQ - R\=H?LhS@J6BuKlFdQG)BCaRBef]n@uFkS8*i-gpJ6Xi - 8NOT-oPLN-N[.Gi+MlTs0I3_3fW'GGOd'ZIiu]?4tS5q!$@S"_utFB_Wrhd - P$7K@IP6bdbdQM!\]?sVG76:Unb,_H68l-0;EhQQPR\FpW&E#a*Ot5a:+b*&]^\krtDI*Q" - >_`q1jOkLRINO)LAC*q7tF(f8'$?8U:#)H3qB6(Una@\9j9i'$mEAa/4E3Vh'o-MP30=0=` - (#QYcO8m13*9J%qDLZ3;V^H0;PZMUZqO[Kadir1D,ZYKLm'\dHKT/GG;-%\\7%8:0QPI(>Y - m%lEYY2>[$"Df=&ALW'*tT)=)GMKbbBDqf]TgjRIcI)oXlfIqX@c`fp=$ST8Cd>E?1oD7c/ - gUEVpYN$E`f=O8GUjDf,"BKtX+#P47Bk - _$)'r,8uh#OD;Sp]&SM8S$7p7&Es7Q:kf;q'/4:Tpcs5`$rJoF<7"eB?/^-Z@q#-9ISD:74+9OGZ.^$oSl - 8V;]/S#?``3;76)YL"X]@H$nIo- - ,$9t;I%MV;D$ZSGn"*%=4>Fm;h8b25L96.!5MDN#m.oh4:q_4:g=kB_9dQHd@IBgHIJO=nd - H,^7*;4AcffXh/W0\#oOZiOH$PP8-CoF.hbYNjGtW4-&pJnOCqHM$L - ^iA)-iC:S[:S5>U?u.*>GXW@H'=]Wj$2;V\f8bL4T\$:P"Ui4%gcH%b0cWh_e^WsDh+g]:ki#:^2"9U,m'QQOcd&Wmm*JMp#k63kh2t=WDf$Efd - I41]r6fNNPA8h&]s2D.m-;^+kSB2\a:@2,ND\4\F*Rml+6<;^@;?j9h(OlC&&O@]^SKn - Y8>cpQ0T@XBYM;'fJ3(#+P?U!.$3go2E4X=p` - 9Y(6)mO![Nm6/I4MKL?F*i[bi:pV#M;n.N=EUV6IG]P5q#4Wmkd>\?n!V^:J$.2`AM7&K]n\fFfo+^!DhXXp`k; - ,8gZ`@SZ3_e84@be3*ol35Mllg;[25GWF9Wak(tF"Eee+6N`cYi2eXhh"+k&bJPd;WuYif&dmPosWFfaV*BigFh?L&HO)" - mmD)g\G@CRn7sUY?(NsAFCQqb]QdOl8Iq3e#Xc>?e^][DU(5=\&[]5g_"%8`MLNi(E?mhOeZs\n`#hpL0N) - 1@8s;@IB,^Ngl(]DG4$cc("[h7h@m[[0-JfXe]rE"lIf)@XK7_0Y1;DKjC7J7?^`\Bq5AU\ - #iHCCZh&4aaP)>s<(3^FOM_--QZZaBZ4`oWCBtl+YAqOt`tS5Q8R[_rL;\N]&t"&?iXn>0` - ?$<@=Iu[S43TQq]VrCS@b4JGmqp&:Gl*\ZtS<5E67FVXYR'iA^bd3XBlk[8a01b3We*q7H - X-,1@L<\/`,A7KF7Yo,80ln%fc5\Q*.3DgpU2 - @^Halm]0g$kqAg\?a6KO1FUiX$=%$gD8,1fZjM^8(Vr-+'fF<<%0"^7.';>`I##>@9r#fV@_;iIBYna+BRM;e)1>1Cg=h,g05+e@# - 3#!N5k0MDSo@W,(S9ouADU4B\")<_Ma\aSQ8H%t*^;op!_.>c]&)hOQCe1W,`&6)?p8C?g@ - #og,f%ca\EkYLZb,)[rn\km.4='k:^\#ikMu)6`;/_#(c*\S:/2oebGuI1QI"!phIY-K_.u - 2A+.O4K^k\JS194I"aSXB<_id[Acm'"./s$R:hl?9qfd^0FsZqS?DO8_DJK!d9I!QDdIXA\ - :Mn-Y7,#Oj>R0JX,W2ET3=6uG=UNPb[/6Lo^(6:6p>Y4rf/4U$C9oP>qf/o8qqpo\,Fd81n - i$./^3@g=7e!%uQd0F5H*%)>Uc#G_M(N6_e!Q_r<:*QZTQDnJ^//Y-3p)3>Ck\UD:_)1cd^sVF - 0hh!-2a\]+eT-&kj(X`'W4:K%o7[gb$MiM09tt@[2gCUVW3B%VY)<[)^!45>BSUDK6`c<0ZiRPNj#0P - (J.Frq;M.1K"GO/TCGsD'8?V+Yo!3nX1j>VF9aul7Qc!m-G75djpEZje25W;Sqri-S18Dd& - o^cUX[Yq@-#S7)aNjB5lic93Y8J/n'#YbCMoojfTU@4Td.N(8u1_sT]se-/:f/4;aAF - +OKF]g2TMLF/?:\h'elis0_1U#c[@`^+#1*W35_%Bcf!V2fK6nC3RY8oT`$oM1_:/t&2CcN - X0+H48sX5EU8g>pD]ZLN.-?N?\'crI;ps04_PFN!4i^&O0_mll#rf*jbHl`dN!DOV%61]g5 - Jo=ccVDG(O!_0t&9Fr\1:8Y'4uDak+qIHc.7QEl4Oe56d'PF;Cah_EO$+Y?*J9N`&FD^S7W - -]87#%f07GtLD%ffPpiUcR>mb:.hgHW&X7`-.HNKC@SSF=]%&i6LI_"Kq,haikR2^?-;$J: - UN0#_[o1_&e2laf1e;QlkFfb/Bed<.qN[V5;-97kVVY0f2nIk`a59B?m3Kpa+*)Q:u99_@0 - nNVoeP*mh%V-Esm/+Tt"DL^ie]%+D!_d5]"%oPrMG6_$.nG - /WhH44.I.F?2QW0$,RU]np)E'hqh#,?$Ic-1s7l:k^V=5t4kE-.PRjeZpIDf\"$_`G;X=NS - ,Yb3'GY:!hcM;T\BiAoZ4GOWT3d,Das3DmPcpek/6tnldi%nglq=+>?1Z+op]=j;-FTt>#\ - o9ZCbN693W/J@DXdb$7b]:*^Yi6*\ekmc__*.QXc.*:EsmJC->dreO-VrksRl%bB=ZEDE/t - 7_2B"l0!P?k+(g3m?rh"f2@CY5QW*MI&Ctf@eC%b<*g0:YBGQVnMOpHb7cr9%((OX\(8Dec - H4+ns/+MWGU\LiVDS%UVktM72bI6s+UnjuIPP/OR(6<<$2eMd7,Be0I1(@ENokhQ)@CGK+8 - RB([1-^a>]-Gr?2ZaH?#4R/?#<*,"p,b`"?Qs`O::l1&hWJ\$Hh%@Q&Y].8h-SpVg=]0UFjAfW\5_l.Qg*ka\*2@iUiG>mqj7@Q7>KpX'j^ - AXaQP=U_g>.\$hsPT"Quh?YN/La_:[q20H7_F4X-.-LZ%u@r@Y1DYO$-8S6kt`7ur,*K;C- - c;m-E0k7fktMY(m;CHSE>m>d%eD4.fq%j#-b*S[E;,"#t%iT&M - a%[F8,fSfEYh:H$-V-Mj5iZX;EtLe>*W61_T3cGiB"]joefO#.X(-f^g$ro$YiP\9:h6"/) - k-7nW2iXdHOAWDKA5!=b_WOjg9:0V^[s-Sn`n&haqUm/rKe0^*[Z]&V;CClk5?r1S?0r#tp - 2m2on7PnH)$cZpt&F0.6b!YHZi3`9_VcC?p1*hP0)1j?YTf9qTh(Q6m*N!AU,;A"kS9oRb\ - 9^+I#l:O(d-DRXj3`:PGs\<'lBM'q,:Z=8Dam,Oq - 2ZYg3-jh^)=qhjU^Hqo4+P;C&[?'niA6HWdVMh\$Df+Cd_2#C,KVi(0?kOn5G+UPT)%uQ&L - n+fXeV7;3gBR(E2(el2AH?Cl7)[9UVu'3A!tddR(##Ak389hSXF[dRCZTqBl>Sso"g2V-U] - C@nZW8PL'!g$"?MPIg66#sQ:(/HQBPdtlN(Rk-!s=!Pe%h[".\Mu/2pstX2$`s)T/X[^]V0 - kXP/[;+Ao7+?`fc[#/GSg(O$MM`]1,1l-J5T8u/R]fpG)eQEX#+HY=HQkDQVcJI<"c\heC&KDI9,)\l0A9cO)IdT1B/*P[VY`MLDiC$VoTb'I6um'D+ - P!DuHieY1Ys:JWHZQ7'O+S/B1QMCqN^I$[o6b:QAn""nX0P,=5!u,(!5"g'4/)bfVDmEb]% - OLoHI9!J9Egos6b=NIFjF>FZ4QGcd&R.08u+dQ[BI\5j=^CM@,88!*PR%1^;(>q!#`O:,JT - $R[bsfo(aoPQ@DJ8u#,?rLe#AOTOLZTRfa?76qb\hi6#O;&DHf\+f[$r&,t;muQ\"jr/(2B - g5JA7q`5"1J)n3Hu2,DZ76nR%R%7b\ec[TC#%"_'].s&71)7cIR\mQJh)[X=89F,R3aP;e> - _sO%k03p??cga!LX0V"G:9ajeQFl"oS)_50kQ+r"!rTb8SAI>>/U)T&qE0ooHC#Q'Yp8[Cj - uQ';:EH.O?,N0ZV?Ou:89EDopSGMRDEKXQ4&'i3f6't9)8,9.o%+lG5H@Djn'Es&I#YSq1' - jF$S,fsiE?c-YgS#,LWV_Unf/+c.EYnXs$ljQn40/M$[E+K4TQOp,DH@bqjuSiT%.70MdQ^ - PA?M"Y([W?1/*3RZciGa1Q!Pfl3!)M9Oi!6_!RhIF.gZ+b'bM%V6g47A,+P&Jm/i]s34bLO - 5=%gpQq8/HRcc4AZ's!7_2r&LH%#HmEMf(I00:oeb^qcAq)WsX9UtptY-39>k/(4opga#$S - eD4!1qdr1TMXSiLe)Wk/1:7K.#M)VKg>f+r&\>TV7kd7gfKl"ZS)pSqkQ0L>Xh_"!&@"+[f - [A"HQB7h(_foBHYts'R$q#1pj,US=Fks?UgpYhik0MjC$]Mb'EsSMJ&=)Fd7(Oi$n`/:QW*QJKZ.mGVZ91]S/-"NEC7R+R=kIU6 - #)V?83=W7cQ,ro):n9OVf?r)))7k/sR5aLrj]&@-O(Ak)NTN??"#W9G^NZ;EfVSTbcjF)DI - bE7AUs&OCYs)Te^`1,B(`22R&aS;[pY0n2e?.YnSaElS>oqgU033Pq,dNYg&7_ee_M0p@)P - )&hfEAE9@7J0h[Xe9J_#-<5i>:R+ujL+d'lWnsNak?SRtnB(MGGp4#B%d:i0@>rJ`]QAB+#6@5@J(&BJ1klNi@HUVIZUDdZgm&RIfH%toD[aM0TiUI5S1:U$pu_u2\&3ZoKNmT.)GQh*0DtJ'GiK$7i":AC7PD?Kp63+RF/:G*$PUhV", - Q3`.$(Bl^N(Q[dC*mq(RNXQ?>ctU$RUVERGhAR8UDX?'CH#ZIoW.n9bd@1AK6P&p#dU1`[6 - .*igB@MR6-ZP5;s!/3sWa-kGps>s:?IiU];Te.K_f6AEA:@8Sb9%7UcUEqgm`'U./e5"%gm - )4!bZ2\Auqofl8P2&/VZ<3@0BG.#ZWJ?Q=r:T$_B>h+qpg[3 - hZ)I-G(n`=[,tgF&O-m`XC-a]gE5WpAe!>>5:V5Zg`-@pD(_h<"KY@(r4%j&Hr6??o8/q:k - 8-D'f7ekHs\h_pO6JYoq+.h7s&idi2.P*>2_6QM2!W0[N9AH-T3>#a0L!bN(>An6BS(C3`; - 6>O`[iVcj.\QPU]0=5.Z-T(;MRp*qWKWdfYmNNkoKSW - ;FZ+-t#MNj:g^u9_5@!j*=>alg5/%Wq+^W/=m&2'6V\SNGs0cdVG2KfI2K_ks.(+>-=;DX.@p'RG\F4B@D5-X803d0)^,ZklKj5UA2pPd>4jsM4=)Hi>hKQ*jc - Lj>%=4VN-F$bA".q.n2*\qH[X0Dm$FfWbW78_d1SeRf\C.I`RN?.R23\X+X!*q53gro4Gp3 - NS>g\4ArBYnD7(j5=MNP)j>-^k(^ThX5dj.e.$5XV@T,RpKflWPB]TmIjj;h0tf$TE$I - V%3rqVm#7=9Rq1o3?b=9saJe1BX5r^9J)kjGn-I'1R!_f\P'!rn1dbnk<'RHP+DUm5nI1]DR_#q7#"Xe7GSd+;=UpnYj+'N]G$/,* - \a6I+U]YU(\OD4qRt8-/3S6UIU[&2Ze^$J*fdBXJYO'P,EZp?`'8F*X"Il;O2: - ;b!`BS<^5q'WbD;Z=.RWV!!J;_b#+_jn(R#%o%#l)L10e1rsc;.FQ.gm1QDc8#[4MV(^N*2 - I:3#8J:ub&L;fh%K$->$_1^,Zsk/Xn[Sn4KFQKk^^d+nAQjtjhbR[LS0u*9:6Xq=VmQ6K)N - aNn"\B^JJZaueFV>@1">nah^(J15LKe2!`A94V+(9RjZ5,pO5oMa3AK,rk7e0Lu$R]RfFX` - UD,*oaHR,`#QVP\-/ab(nF[asg&Qr]g3.S>1%h&Jmj<>!_b4*ba]otN9gnY8CZcHY#0">r1OPm^$=)AJcPtd*s@ZnT-0[ZF<$Oi;;!>Ae3#Q="!-(\.R0P)&L7C - $2`sgKGA,t%?)$S>PK$'oPYC - a`l^9Y6&1\mNZ"GDC/mqR3H-TW[U"l)&VO`Yc`6;JUt$-IgfSaX!4:&nPASP(Xfb:Ea!;[Y - k;/kn-;h3RUpZN/cCqFta@/GWHEBWu[=V - .l"rYCL"3SoIQq4WGps2*9]_H&W;g5#+EsGj86%lT4LGX6Y_oii29C4:=d0GX$\JnNXD.L> - fo]@1R>pH7@mO=P`Z=VdYRo*dHT%+aW@DSU=:l>h7Dn:Il2!dUD0V"?V"@CM6Tdb:Y?,T3*c2rGb_T8bM+-eg.a4YcqD7C_^p/2A*a`rGda:S)(_$sjHF - _bN1WqU]*\,$%.BIH#s)trdY"uA\VMasPDIdk8KY1CLGV5F"5#;KD7'tQu(l0:25iZ(IF+h - _*>a[LsfX2f0bi@:--8A]^_Ruq8J1T_R)lJ2hNZA!QL'9aPP^_0UHZLO<^2Ki^n:tr(0\>'0]:0!mQm&m?")gnQLp(pCcD8@bSIBde7r - U\il\09G)]cl_=hqi)(a(W(BUu2'a[F8AL:,+-6eK)ril9&@O^5(>;+(L2XrE]IhTAM'tT! - GGOX;V$ohDZh*VV%QIpUls[]`K;O$,>`lKo!eL%dC!=lc>VILp8Vk)O,h3\U10*+_q_U2RX - GR%EcM>9-j]$#cqNr3K\#+j-r6V%)C8?^%8BX_r.LF%C)D^ZssOoK7(C;&@`q:1uo6'Ms2] - )L9Z+B6)5F.HgRsY"[UOZW)sbMnot201acZOWsBcLYTL$r_S9U&RU^ICOVkF7@`"7_L9^b! - S,P2%3WMQ"Q6X3Gj7&&@+X^eE_E.'C0HmB>.R,UC]o^)aTMM?IBc&73R94G`oG^094I$TjZ - jX%GX$X_Q'1!kKZtm$496WZp9<#6k^3i2MU_l1p)*YDt7&3GZ6l[DUCk*L"J1OHG1f)!@"9 - ;t0]aD#pfF^P?*s#%X+,e7F!)gdeBe/aIR^h7N'J).q9gmV87H@6p0E];p"i_-`,]PMh"7V - 6?2hFZ.W/*^Od1lppA\t3XLC%od]Lt`4Cld(00PitTgheYH6*SP=YhM]-`'h4R7Oci+/c8. - !@o>:-;o`:]7L6`Jh/TrB,*.O^e80CUX9["l_eR#CS:_AQbrK4u$=1 - G;"k)bVufi>is/*gnj:-EMaF<"U_ptKV\:-]q,@sjWZEa/#`[c40q&4)-EjIq'VA>a.KnuLA>O=0sf!G`lqu - 6NKfaE1^=BJa9.p-"2cAtJj-^?.Rp-'QkB9c]YPl[HVfWj2]@1J&Fp/Ha?g"I>gC"N:S.cqZrU=9U-IMjp.\\=3^PMN8qZ)) - ;#IH7k);F,QEX39::j0VAm0`/8X4"Pf&koZSsc/2K:98LZ!Gq5PI*d*Mh@:Mfc\g-H?sg6V - j3_lFn#nSfMJ-cbb9:3_66r>h!tl9P3.^(i%EeEoXTEk><>WMC7jF;@c[R*Rk+7u]3ar>pj - 'I*O-t-Qsh-aM]@:dSRb.SZ1;j=FJ6n^f*(/)N`jS0a]q6hUE9+e0/NC3+9[c@_]]gUdLS+ - &8@&N)M_2JSe9Z%fR?_C`u:ZCMg6!@I7)L1:l9ro(d19u"#J"\3Ma2+28G8J@!aB)W!D]QT - n4oEoVE/s*u>(h9d)l&M2<(;E#POM#Ln6\[7o,E$dt6s;PXlT8nq8B'0Al%;WP+2oQ<,NB; - i3m`07i7d/ZsZ2$_:(T@I5(Z)A;3:I:c2+7XnXd6Jrl-ItV(_p%*FatTD#+'7!@fB%H"TrK - 3^r=XNO'EqtOjSqaVbTFN'#K44*m>'>BJ(Tn^-P_40V-]Rrnbp4b - hohR+!dT't)P'pe;D2o18A\.PHZo+3t*GEJ='?<7NYlmKZCU^F*RjGac7t_c6&H3P'*tjF2 - RY?q;[7-"C>e]K)cRBerEZ'Zcj]P!i;I* - /K<6P'mjF!8u"^fTM'f'kEWOUg=$D);Gg>(8S%d\kZDGjA,#@a$fG]FRiZt:"giWf(I+D<2 - 22b`PV.$O/1Mjc - hrXNXOO`0#$U4A?Sb_0Wl$)Nh;'(BQm.S_FS/1^E!=*UoX4FI&/e?iW:hT(FBGPq(XB+5BQ - X7l,ZujRC)mn^btSU1MHm:%f#1\4c??_P#bBo>I_=VAGcU4_pCAi&Y6Jfg]cQ"?<;-SO8Vr - JQP.n.m;?@rU=69$==dV?S&DdJS@m^[TmsJ6#Ig!'a[c28L:M - bB8[1$#:T+Q5X&!N9O81>M[ZiV`@)3sg3!nTY-P^o:N]IHR>7.cm&pk`YYnn1_!6#cZ.kEQfjr`/ - t80)jsda`)A4%`ZBFPg'(jUp,(Kehb'aCDV7R).T79>och-0W - ]E#C+!!B!Z'i[6BD?]-^B]bR$*KDXGi?#P&;s)SAO-UfG\S[Rm'Hf@J7PnUf*cRFtgT)lkR - lPeQM]YaVN8oGSR49Rb8+(:>qfqPe` - D4S7%ushd,1`M'/BcOkiRohp5eGBOQdH?_lRSbeC#AdO3r'f^g&!1>Z1XBR(Wb2BqdHbBF* - k=G3Oek6M+b46WjKLVG+n#9d(NHUhWd[O_Rpnl=QpYG,OV[W9T\JlDCTH[]A]5XQnB=lK58 - 7p93cdYj3(0lR&q'2RD^=[-Lc#lXmTk7Zt3j*GINiQTP'VF9a(#lpC85(MR>l#/>\6@KmO$r]2WO3k9Y[ksUZo.h<< - e,p`0RY2795tGC[ZeFdV6'/!*5S+-L>Oc$RB_/P_9,WAJQ4[jpS6e>@usbG5(H[q!XOEn## - sM[eoO5r9r58n)jW"RoIrn7MspG6dVm#jrK%4gsLB8Z,hj>%%U - k!h>0;2XnBiS,eC,7M#aaffF*dd"&kGlnUCb95k:ceaU,I,OYsCNsT`e1^3BYMg='WX6aZU - +4tOXD#7OOke1gSRVagrkTPTG<:s3D+ - >rGhr!kJ&0VlF_-c>B2\XE_b&`%b$*>e;kt1nqg]DRmk7ABgb,(?TocC9ul-uFrV#HifkB( - \@7X?e/+VY\Sm)p2hUlqK_SW&ph,9r7u*,;1WapIW**SL04MfSm7$YBJ1P&6f42YK'"n]`8 - ;8/+c\QgqLA=o9q.H#hGF/,\R/*):q59\W\"!36SGCd-q<+@FpRh9eT_]IuqBr$62l$4>V# - "/hqIc]$J!:^:AO7g"k8p2f,TUt@:u9faGie=92B;/IRj<'6'VR1HO/NQ'Vg5%Z$mLP/p4G - Ha+P:UNnfWa*!(Lf;SS]`#K23hK+"-g1^hn"8[8k6@^*\46_0=u5=/`/eS^ibH%Rj>MI&G- - b\'+]ibl$);r9)7;hdCti'&M0S>Qde"0EIK`?%"rdI3`-*ekPNVd%km2rMSBJ\(gl%h#5j\ - rTE&9pYYrTi;OPOr[6_)2rjm-jSi6Brb(BmGN\s\kl-q5rho&\\*J#4_3QF;F;KscBEEThe - 9sjgIh2#Ckk!44!9rHKUF]uIj[p?2iCj'#GVUo[n$>r0lY]fXR^B - J##-\KkO_2rIR#Jq%2(p4b\$nOBU!YdK%!^QB?-H$#Q6rl^3&dJ_3&PO>NULjio8>G2P65_ - H@-sDgmWC\"nQ\fG0'hArGKd"O#.V>,!PQ=X?`G#b$p):!?raV%R@-V=_DR&;D - @Q?T+g#UI''Bnfra=_\)jUd/[Q#-Frl)U>aml^I7G4DYrBn$2537a*@L)!G>7dQm-!Ck8r, - T'!7pCS'a@DO[X:mua0\+q"5Re\UUA%h5aYgeS[(nXOM_JY:[rh*7$Leo:584c - h&4g7FCau029pg*D]\copYUc_easlA2!Y.B5AT4'Bi3Wi>-1u6SQ:j%*!0%5V;#M5"i=)X? - pmBkDk"P$eOnhD]VFG"\5s9bQcJXn**%F\U-KcKB2kmcboDS5L9N:!^P+!1\#pdYO22H&A0 - e.Y#trsaVcl_Iddc:ZG^"kOcqI!8D+t-Uj.rn,S>W)9eE^"KM`(288(RlU*XuB"X*pr+4-! - l%cP//`dB3On>o^.d8p_7KJA3Xc5K&PD%5I@lkN)p.m9hY.Kku%Ca"*K/3nrd!CFs2k"#fL - 1DmJ-)UM;M5jPPV0FK)AGBr.t4iPf!(ZG!K.IcUC6\ru)j$[U@;6DfHf\IM,KQ3#Lc8nHtm - 2b6*H&khj5"F9(+63QUOAZQT86HBFj@"idZ'%RG+]9^6J;04QZ:ZHoU(-2$D0XuA\#ko8EB - kG&D?t8/2o%Ve6-)ui6+U)&M-MI*KT;1HW^TDL`%D6^\P!%!?8%[50?UW^?OrQR5)'(6Qm: - r&$mCD!R5c1XA+YXcMUD.="=ctdWM"R64.G[)KJI@( - O/ds$#1mFFGGtQ1fGgFf]^/sOaTM7+\%I+@YW'q#d<%`o%g)WQ#h%?AWFDT?(YVkX]4DI2s - Y_?gS%4MB%MTBbW-t%< - *G8Yl:":D3a('.sEG(G$-@T9I5#'8ZCGMMlL62c>=Jh")_'$`\,"T$b,m9qZ]L- - HFpr:,e5a@0Fd9q,J1B'Ub4kas$)Mf+IkH8N*-2KchES!EQ\2Rnt$T[/ES5-A3pbXebt?\? - sA-m6LR;#!H@gAi/R:fCl&cO0di&7ElEh#qhM)E7B:'gmG$7o7!3kY]["o.^-^foJU9h&W9 - _L66jdQST.H/2afQ\"e&`5"%ZKm=Jik"aZ4>W8eb?JDMDE:GiuErEL^-J@a<'@!cZp'7RkEMRJ`G%2&C^&@3*LN0Ag`6*H,P*;+3J'lZ9f(Q7Q<@mZ'GK\ - L+5`eR&`[LY8u[$LQV.$>3HL#/\7mH$JhHM_2@X>,W#dF$6G7TK**6=;4Nqq6-AR]d9_&dn - BLYtRrpB4ETHfE6.a\2A6KCa1NDd-[,0j&5>IiW?hR'A2UgZN5-k<2PRF$93o>>BXNp\ii. - H5'%p[Gadhg.5*C#S\dt*AOomiQ(N/Nsfr$VoJZ!c^gHt31X]7#/Gl0ZCOrdFhEs6p$h0E` - P0]O,Oj*MLXW.L[9A&8D5V&PsV-i5U%UQn62J%$3/NDX&!p0H0Er*7-s(V=mR/#18KRR&th - )lu&4BEg^]2[#BC$0M;U\LA:#?g!6DI%]]ecB)1b5qG+QsNkYg\Ldb+FT$*/kDU@1#MUtQN - +/SDr_=[bYnt:^=c(PcHi3^E(rWY'he&6@Z6$0C$WH6D?gkr-GTek(E_&)j>r0Zrt*mbs+3%Er;bltZc!K*AB3kmrC19ofku-n91PaQNQ28- - KX#0I'%jaq(02CoH[DXV6gj-SUS(Y0P6%]+jWR^qogV+nYs=be!mo!W`uCEHMY@7gm+A`+3 - u(@U-N.W#MZsN,0*9hAX&TeCk - D%!S\`*jZ1,^B$f_CJIm+Asp=1,U:cD]k0O4e\Vr.:*)P*/M - >\F@;Ws3Ekg+e3Y[o.YpDslc*`&*edE*HUU>#%HgFg;iOkh,+P0;1]m4sp@D:$MQneX'_Xa - q8)!4a8I7Rh("HN>2ZE":Ie)_*Vf/Fq1/d\abk!ZFo7'PiR3Z*4Z=Xk)Z\-.1LKQT*Q8h]d*,NN1hdW[bDaZQoRne1L3Z<8J=m5?^pV - /p5T-GkPeXZYf72j"t:dg%6VK+`7m#*XrM1QNq]SMBK/1,+JJn;02HSI'?n5tU)u,$-j8:G - alA$o>btZc>BH3CC/9bYutRE`G9%#`8+HZq[+p/J`:ZcXh@7s4gm5@qJ - C_Q%>PlP:#]eD1i0Tjs@obR)IbqYI13?dbk;#'D4g0,?VA3dT) - DpEueDAE?=V%9pP/$Q)R(#!b0]d>B7>UPVH1fR8t(2@J1jFIlZ0g=>W-G42MFSC - -VDrC=&q+YQ8`JecXYI39K#=Q(7<0d9ej"p?^$mbe9=jbVTT`f82e%MG&^(HFYm,68TjE:2 - UuYbqe3Dg9(nBWiH71rjhkJTS;b5dmq?ARq:)pIEO3gp1o-ZAUAR1He*[r - Qj&"X*IO/)?$FP-=9p*PeTj%EE1*Y?KHaUP6pcF.R8BJ@ND - ARePGXm=kpK2NKKW1f"Fn^?/!HiOYE0t$bGW1C%?\A'sB:!OW(jUp^LnD1QB_YMYQqN-ul# - \i4Lo84H=&3c.ZZ%h3Fh")pR!4H4,DXlf@@3[FR)P"t#Di-eDE&Ah314LtgPgpTMH&&N2*" - 0+&NUcaHoSTqiY@C&c\r\aO')LF-7b&,0mrbiNH[['3AeH"hpk".AteRc:<5Ga"A[I^;go2mtr)\(P[;3 - L^/(R5c^Wkoo5cqdKUGK#[md$%_SOS9[ - o,6mJJSQ)#8_Af>2GRS/]F:N>%)V`KBm\lk"Q&"gCbTD+J<=-]P,JjNqV@k1aY'9-Pt.A6L - eI_$2F)Ob;jJ:d1'#nnmo\&g^> - Xf$Kd-*t!Z(3=hiJ!R\1YF?,[HI\bb=/aj1GkL6ZRE;]Yc`Ze6Y;t@CK?LINh5n/fZWf_R3 - u!Rs1@RNORStVA]]Mib>ob/%F:J]1fW5WTgJRD=P]ZCQ&Jq8^)RBo2V5[3fO"HSQs/O$fU]h - u'HrtG&KCn@gaXM\$]CMc^RR7$2MJu9?*W(t5<6W<\J<%L/].#5_`C6*Jfhn?Zbu]P`qIO@L7##rgKhkTB=q.&]X:7Q3A8D-REDs0a&n,;S0u5pX2WH?` - Z"To_@=MPTurnEbk:GJ(jX;0=3Ud]bL"qd(idg;$-\cpbhVI/21<_OF3U2,cU&#b&D,35!$ - M4,Ln+"^]bO?`q1]mfZ@*K1r<3X9$.:sILj]rb4Z,m')kWVeW;H+a4B9`+$ds!`d_-IFpj( - =O2q>9he%.9PgT/:4J"Tu5clGgd]i!0_)Qm^83&n - >Q'/@Qa/<4g:kl5Fu4np\I+O5&=2*DD!"#"s6`M,0X9g^0Eg?V>O&'r5ZSKKBN+2Xnk95+: - jhQnd,5I5N*0@<%]$tLI:#SBClf2qhm_306kt"3;&=q,SCo`NTDIJ`u`X+]OEGhMEb\d(mI - @$24I>'':IA05$p`(=k%Wp4\.6.W>; - &>T7k6AL#Y*%nGWU!QR*)>+(\_Z^@GAb[Jo59QAQZcioL^RNEesLSo('i/]htqil;2H7<_W - Ce:n,^!!)c.c`CV]3YWbXn4ll,mDY7(&iVC@Z<_4liBnGSp)iR8<'k8Zgs*!Z%.!?5Xp;[/ - _h'O#Rsmg8"l,UlVnM^EA\EudbgdNo=A7u>h@*0MRK'?)[35`:ZVtoRfcA,1+KZ[7"eMCq((8OMn^8$a:bd#HQ5"^(SWZLAK=UAQr59lsh#K1 - 'J%233n,L/."*4o/%f#KBkX#1^<&M@lMXo;II3lHeS/+00@>H]J_pRCKgGKCuZFo5tL)IY$ - d.M!j7&1km:+Xo'7#ID6nFlpOW>5]Pf=GoY#0YhY=fs"]os+m39o"?u[/!AROXI&n,3[rYf - ,%jk_5=)#0f&Mb4Kg17$)RbjM[,=TeCA*HPae"I_>:S!=jOAeJQ[R%]OQk&/+-2]WQbJ@$O - ,V?*<%lr#,-k4)TNUDXt>?"IH@qo2oUjn>I%R8R;3.V&e82M+8no#-JX'+Dta)ckd*Ao.<0 - Oejoq@?Zoo1-rgg9JW?lPTpKpJ\=iXif9h6C20?=WbSQ;^$tqe)+gHBW]a"WX*Wd9Y,f/)] - s"L6"2seYk;o\F$t9IsJL^X)!'j2p5ER^7IUr_HMdp4bBpqXuFl.hp`E+cQ* - ]aBIAB_$>1F?q`RI`cbQZK93DS.[)k@=s$MmX@Z;E[Qr&9/`TaZ3ujkFE9`F\]Q'OYTqS]X - ,[rf&FaT+\H:po1M1/4:bi&@0e[bBOUJeg*j4:pmG@nkd - Tc)uF?4V-tt'4#0eqNgZ'c9s1a@1hA]S8e9Z+- - /J(Zoc)@;-e-^h)WZ=L+[uEi@&pfJ4S]=2)+JtZlSoT^Fb:7-YWh-=;VNfT'`s$5uQ-=>OZ - .WO*Ko8ZiI!f(W^_n]tAf"L3[N1V?Vc<5,,1cCG>Z*_+8JTc$ilt<#M;h2ke'TNaKV!KfJa - ,_9]"=@K93Fmn9@ipo,,\h$&!b[`L?e7ICX@g>O.]X9P`PJ<7'P"73^,eG_<+iT0cYK<]5=H@$(4r - 'K7dl^g/V()U[0a1`&)o0%%i+rf>'J7lW#@9CE'X3'$)4XEF`IB(5S#ZTur9+H$8 - [Y_$t$F:1Ld@DJ'KNGV - 3aN`1bqa3:nS)mNOQ,rN,Is(j1jK$+@XR1#;(2eh`m6L]QONrEV8dHXc;%kaTS\=:h^aMk; - 8)hOheqF&$?c(DeE!0^eFM@oIX_Y.HedSHOP6a3qJZt+d(D85Uf\rio;WKGPfiqIpi]=%-E - BD+>>?c"[$sn4aM<_0T]!@qXcaV66`?"3BrLQ-u.dX[5]?0t+DfDPe<'L$bJcC3+XoUXfR* - S1bZ&t_2i_GTS-6B,e.P+"e]PcHf%=D46=&A]D`$+6T8bO:,QaW:m$)]$sB2riN.SNta@r8 - XUf\S5;*4_A($irGZ"TED5_c>W[G>SL;ZlY_F7/J>8Pd:u:J=I6nr_KGV3ct:S\&7r=bS_n - sM1l`U`OdirE&jG`-fR=9-R`:>[Z/6u4aeaiAD5boPO"_:(pFH$^lbAoj,VgL?ppd=U&@3hsb6#D[&,KCOjACb?,gn>aCF`I9bZDAbCD0qROI];$=rO">5kat7sYFmghQj - 33.;>P3O\f)pM1'`F,3p6EVe$>8"mZXNjhQDC%YK$\5X%U!Joa/e`jBGH(iT\#Q-&c71TQ)5@Z)/=?9td2Y]oX[oZnMM30`hb=!q\9*(d5IA+IR5YP - >RI(aIS.&[18LB7B?Q)MBV_TfrQ9bZ,2rl$&I&o@3qCVn\ - C&:'dtCs\/7WT'u\`L`9Vk(YX#-jl5>FqVl;.!@%)n5PnF+[T6W:1ikI[%5WPV6!Vd\S]6o - 3m;Rc-[PrW7iOf=AX,DefVVpLergdW7@U7:aU,+D[YWqiC#qPr=]YIkMgHap%Q0r\V;WH'e - oJi'Hjcpk*W%3-7to4,VK_+,oD_:h,^HOZuQ66nC28#XAC/',0S,f(II0a&i($dB`NcD:o] - 8*I+4$(I5(=W)77XPD!=,J>PojMjY4+8?3$_*e'ZsMi8n];=Hi - sMuDi]d1NuRBs3K_#ERYcj-'7onD+`3q^#JOk28:VIK3#,([:4bG[bA:K3ED2d@_%@P75NJ - E#KF^Oo&4VTj7\mYqZtll3'ZSoC`q1%e$l@+b`>nZnUPljcgBX_D#c[\-WXQk&FE]F_Gd`i - _9YA[Y"FM]"'.UU..a&Q"oZsX=J"D#3V#/J39[np_[1IU2)ek-l];I]:ecOWp!K>nM%,Je\ - NAm86+7WJI@'g6VTa;V^aABn]/EeKtqE7Y)cE#Ru]M3r^Uk2!1Xg3YZH'T"8;\8#l9o;>qM - fpJID5B;/'r'!g<9f(6*`&.Ac`(u;r;8U#3\qU@W*;B8]sG.*[Gj#_:C%WOJL/*inf$QV9OE1gH@ - U0+WF_('';0Z!?r2DiN67*!%`2/BMLr-51fCtkPo3B>AGn.9s0W`SS!(WJ5^h5c$9:s,&j`n - 9e(^pJ9@)XW5?""FfhT**>80b6=OdA=M'tq$L"F\=&BY4h8Q;?L8goZJ$`;s1,9B?3Ya][!^_aKa1i?og((T=!f;"_2clT0eo4,`c!5<=g]Q$U>M? - _ole4uT>:p$4Q;M*o:k./,$40%F[&Rf<.a=7\]`Vs>Q17_bE$A@he:\E;)IX;C+Y\m8Pt"3 - gN(p+kh%Ep\lC@7?7a#)Wj'Kb&?cNoKbZ1agN#PHd*)SSs4@C:(?1Q1PZ94B"]VO%aM@/*B - EnbAOhV"$SEV:erX/suKcf4CH"m*81Do1I2Pj*;BdNGV)FpNug$%RmO_$m6@WMNenqWuL4_g!6W+nPhnFo:p-qqY)cC7('++&e)*Y.Wr]d6=-!T,g>4G - p(/kt"dO*cjL\[InCQA\YX-`HAHOgLJ7^eabpf[N_oXSBc:3<@Vc!q];&l*RiXGe#?m/4pa - m\Tiq(#IPMQ/+ifkM"nHJ^Fb:[O,Kuioa6;bYnRLBXompXGl=*,)&]t5&mJ503WBf:l.fb$ - \A]u4:ag&uR0,(U:Z5^sPBJQ?P;8`.$P##@*]2&>'r`PIRf<]kM%]^ofS5 - h:V6m$mJ-S[2\3cQ-&Ff'\OO[>>d3\&dN3:ZF,]g4e^(9Wk2c-&aHPN;8%cQ:"!R@Y2H&_) - N#ED4=)dR$!4XVW8Y@7?8tL!ljC<*E(/;=ZsC_+Gc$hafJb@d?ZbXP@Ag3%7@YTr\"je-u- - OFNC2Q*;X;;l!Qal5R73b%?3e'Y'2c6uL>qVT?1(JK'r(.P**ge";:f(P5+-9'^j@C#UMe_ - dCd*;J^BSLd-'Y0Z7`IE(I:(kQNc9o!Cp!?W[:Nk,f/@Fd?Zg#9%h:^>crRh(nOcH6fm5B+ - J6QVU?g[-H]7H3hlaYE'/B[N)nl)18l,[nX:jCM_ZN?EL8R:e_M6P47Ah=irM<2P`KX1fnBVk - Mb_orq/Bd]]gnoW;SQC.)U!-r$jkcD)NYCaa^kr72j&(qA[Zg&S%mK^13#5(r?5Hc3maka1 - 0UAW9R(f$5h-2Q[FT80t'99pNPhdkLe;=7m[?\%1,rjA:#B:VjGa4t$\FL:J8[jg"AM1N8a - ^kb./nn,@*g&[2MZ6IFk6Q=s8+dn%S<_!R2M-g,/P!"3&r+C/kN3e6$OMr@A"9Z`T0iV]BP`''9IL:2k&V=n.Y - [->3k*%X,R(?:I,2^8rW*,m<+ZI+H]m: - $##P9nLpURH:90G9;YQ.FS?55O&K*0;K['2Alsg - a=(9?RD2$)AW468o`3lE"CF*1Qp@:Abd;q_38+V - Zm%:eF@2]?:(!CG30CI_/=d9Ue0hm3mgA`A$s>EGC/0G#D^:YS3MDNpY4`Xp%CM]c4>N]jG - `pP^;H#I6hQffk7&q5/7H=aKF%-6co_mC_,+AS#,ppW6O8]+R"Ym!:q/XsM6PY0%[E.O\Ic - U)*(^d?clq>+(aP&B0ZCkm?i`__ChPH@`,'D!SWV]%*ll\+JKW$.8ZR-*nOI5$cQ!P%Ye(eWZ&f,+##T?W((r0LJJ:bVnaAN^lRS'3R8_lD - @Du/rI6a.+)0\E@7PU`-Z,Z%U7\4^Ke9i?;S'^aKXr70u[&5c@h%k,.1JkB0q?0(t=2E$.#8Z6c#Aeh)B;kgL:UoE;cd8XG2:9Hd'DBV9!1b.A'26sPO/Hb7\(7PbnX4=e<2 - kLpc)E0M&9@:L6*6u,YhIK$%,ueedDsf\OA"Q=6%j]qRr<\iO(XJ[4'([Ur"Go,RrFP.@Ab - brb6T=b%odX2O&W'R0Q*#3bT94mFio8U;5Z^`7$!4/I0\q3SV4?F1i - T<[^MlnL^*_t44!O7WH:cWUb*!B:ujbN6sKs6n - jO-ih)7u+7*RJ\;:Km2o3C05^IY5tN`'8j=GnMXZ?S5ThX[XEY]IL-@D>J,$un$rdmV_E:" - +jkVmn+JbM]6%[B6(*2L=dk3u20jA(jBfOej)tRoXl61n"#YdiF<[J5au%7*8K)hoVUYNRe - -#[oUI?/q(RNi$&(dhrm(LbGc,r'GaG"jLYe.AW$fsYuBnuG\S5b/hn-b_f/G'`Pa!U\0N< - WUZOHZATYW,2$VZ9nL?t(WtfdF[Y.$E(JpW9_NEFWc1pQ@Ye>H8i2I.$N&>1BW%\I$F6ert.](FqtF=(N@#rZ6ZTW`VQnT64t[_0[Q%NFB&fj>YISLcI/BG:GnoU$`J3.^4a.1N - 7"4R5!_)7;,V[Hct0Gh':*]7H-nZc<9oZ:>o.#3I6d1eVm_63Hd@Q?5,[36T;F!`EaX+,_eST)[WOpB;-!K,ip1,ETCQLU@_oRdAf,q,V^sp=_0/GTf$oZL!c - ^7S0Ik;;I,\!9MX7Z4+q#0O^l%dm6#X<'1=d6ACXe_/Pq:kbfiJJP+0fp8#@[ - +Y[Tq#Kk%7B]i"A^cU6H6O*In1)6t?^TS&i[7CJ[F>+J0pM&K#LXg\u=knU^0>Ci_::mo-< - MWgX7Y(Z-rQ&]"jm*uu6I(m21`;P=MbST - ^PluKi*Q(F:G50>CM-@"u,QI]jjt:M9Kf&/<[`?`Ti4'6TO,16O$T/AQ=;t5Ut]TPB2nX'r'A\%%O,q$a*f<3L`0Hm:&GKkoh? - GVb\rYP#Re4@b0;%,r%jLa%"A1)*='fm`^a=VD>1eh0s\; - \;u"))rVl0h%CqQmuXI+]aUu"d5n+4r(rRN,gbO(U1T%*ZJg`nQdJ07HP=!H@[%S(*l - CUHK!oPIl_l"d*DB`%U?tqR1C4@1AUZoR.-)+f(U'"r.quPF`93;giAeDXO$,k1\t77!Ca: - T@^as&]aJe"E.VE<)9IXQ$p*WuVNRQbWHKc?&%O4oq'&I#:jB - q'e$Pr>g?#aC6@&J7s;Ea:!9/n)$JZh+Q.+=]stO0lJ:fCNNqN]889/5GO2A`#Z>D4 - 8a/M"V&lCJj5iT'k8ogn8Qdr2$_P+&M)&9(X%H!hB]59)!%icfN<=Ups= - eeEAJ>ON2aX+EUYfi\NV1K+g5B(+O]D,XV0V6XRl6LC8bk#[Z$#bO-2qMHT:Aa+&9+Ct!)% - o[#^jR]>$d/^SO_V*rHEX`(oGnD55___A%*:][4]q3ODW@;*'5WrPmq: - P^6bcMR_6NU5`(Z4](uE)@@O^XTBLmft:7oJ=bc+!>Kpr';d-=?:%.1KSME%]Z^koqB<[]S - S+f;7#@X6tYi[Pj?9$H%+o'3:&Rtj=X`\N$=JeG!NSrdCl_R@4XZ<=%[Lrq7fE-=nCnG5p? - bUqltV:(urHm(iY5S.Bu7@&djNg_S6G\2Da7;@Sdnqp/M%Ig[78q^NIQ<:.<9'Q8J`N2L!N - +49cIg,7t8/Q4,P#`n0.$06[Y%VO#dgjSc2PWMkBu&\Xp0OSeM$4Z@WG%Mcg7,o(^.,-#OV - \Ul)@"+Sl:=H"0K)f^,4]R\nuWPqm2#:F)Rg9-'Ec#>iUC\2f(NM9BWOsiqdpL_!7j8%C.24C(/JQe-8ph,Alc3B^I@GI,AP*4S13 - WMBncI9YVp.b!`ZBH$'Om(+PN=k";V3'k)!bDir^E=IYOM)"7m0\;\q0?h?<1s$71(A.\@? - Pim=^jnquqa9(qjR5:=oD-uh`kXX_cf9%-EKOcNQYcau"I>*9J0p.\Gk9/tJ.>X:)i(X#A# - NGSA_;YZGm3!fI"i9GEHP.$3pf[DuC1R9G/U6uUlq[oq,;6]q[Zt\OBBCXdZ!.R(me-(sLC - EP&g5TMt;'0O4_l30e*0K*;FcFZTHY"db4A^W^Mb#0_I2Q+cmXnO%!#V>.'+XJIJAQDn[## - qGf,c[m3#]N#F[WEcoRV^-#VFWVDN*5?95Qo%+7II`VVI&ch"tfEmbO/r7CIGs,70#\D5[d - *F\-M?baDtP*AX7W6,+WeB[kIFsPNn]OISk-CA'=dLZEtg/<@Nd!D(2?="d9,/C;3=mgMD4 - +0X=AKg`t)-HDU[IkDE`dYbA&+JPG^M8q^S]^8^Y`.#c;]1#sma/m?5\!(>L/^cP;GWflKK - M%O'WB0KI1\k4)(:]M)(<.XfMRt1bAUFhH7#th)JPHt98 - P^,`D\Kg;h-l25VH9*%K[aj=o]"85QP&=='Eob"spLGc05.[#sJE^B(>Fi-[qqLchdo8mW]4>Hl<,F7Bgj4R&2lsP,9S]NJP4?jVP]OIVIf= - uJj]H0MQY"i('QTL@g(=%5^7%DY"X_sND,dOP:K_VAEQeM*q8AnkZVV6T#mif9uUjaju-\& - cDH?EXqk8qjd0BZ`k;pm^J(e0C>)Z;/78^3/>HgVL,,5Dgr=:9XNmjN.C*(9FMcGs#YjAc/ - ni,KFrP1fH/etOde8mCbut)a,lhuQ"mSNGR$Ngl0Q*n%F2S-FWG^;UDZBf#^_:Q5UqamN;6 - qhEpTnu9lV+\qE4& - b1FTf0SlX^r.M-"b^FYt[O%@]BdKfWq=Ee\FNeM_;fPQR27'Ou72&m - ]<^db;+(Vt_6d/geb!c^iRUku`_TuqM6@TC9BOsPGU;Fdd,9Bf40-\\E-'h]2,!Z:d5Qe74 - W[sTP^1;p-lsdQGD=XdOoV7TC5L$ng8q*PNXQdNs-:SKZWBC+r)hHW`J^Ya:M7>(tcX`AOF - uQ<@627(,R,3Zg")]N"jfgu_#3rJu]gaRs"EnW=Zo<\J=Jqogoh=lq+j@`of\o5 - #UU?u>V9;#=[S-GDs\?D@R&-?_N\aNUX7;C*N@[+m-?^+aBilE.u40A$NY]l.m+a0?+L(>P - 4!i#n?H,hD3u37h?"pMZehDrR[6-D%Atm;TBj;K"LH-,9[_)odl/EbCE59VF,tSV7$fW - .'5&+A&1KP'eosVb0nVEo9fMkgP6;hIDj>IKRecaOP;.o;COnMqR6$U$?+5$>+E;VWJTt1i - >'6lLk\"*D6!IuS>G:#%(SonHW$Y$=D'f-r_fSWd`]6T6IgXDNR#ifmPU"1kT8:4a"Kn``q - MBgLBBRMm`K$pOXD&H`AYM"ois&1H]-Yo!T]i2lUtLZ.%SA$h#C5)p)dqOB.`=>j]8@Dr/&P*hdu61E+6T$O%f'0D(3bE7u!bYSr&8^1^/ - p!,/3B%%g-AY_sSs<6FqXSV'X=GT^X)EW@gk7=>.)a4\>EpVUB\VBIou\=Qn8J').;R=%.X - J:]NBRqN_>SRd*;rM3uAM=NhJ(cj6#hNL'0q_GP6mZZ$'5;:@65'/^GE3>:*Nppg2XR/n$Y - ;"[m;XW$1]R2$LF;\p612S.rsq&pRK8JkN)Y?M&f\MlLoR5l!2YYV*[Dm+?7M3S7tPtMdU[ - @:"eLR'%`Gk[@3f9R=VRN6UD207bJH3ta]S0'`gWT)3K/,[]9csH9KVIV#jj0>KAi,'`:>f - AZR[_.4TL3)VW2J,@La$+`YY(Gi.@k"og[%tcSGYFTu7bG)^VH7UW?+SLu*/QfC7IHZP^oY - VQ_<#cVCkj-GP%bgA;XXU/p$-k8.c&LZ/NZjIs"lG?H1K$.B1V;)g3n3e(s&3'%' - idJ[RifaWW[PIC2GnBNS?+)Aq/fJbFKpVESAlth$!0&kPP5a7O#aIhCAU(5247AWpE,ZcQa - 2mKQ5>IF=-8f8Q'U$iQPZ2sgI#3KZ;VBf+&'k1V-ZdkO>-0/<-EjFA,L3oIQu*N0P'*=H@" - _E3Z_mS`!`r@4@FL-QqQQB[r?M8AjgL9)^&qX*!nb*dif\A'nGFJ&TQ/$#>bH7H[,,P$'P$ - 9ZM]5E\A(XcMhViJNtbWl2Q?3Oc"5MRq1$)Qe9\C]")=3-&`$l*R3fqM9obnn`nkil%VL2M - e&&/n[=<*U(41kZTlS! - eEn\6Rj - 1k%UGY*kk!!f5]WlNXLq4mru37,RN:ZsGI)NCG"pf>N - +%+a;#`;HG]H;(7c&+`4L=^7^3,uJX\A@d!2rJ/WG[2C>j0C>jdq_[GLG!]jC/og9c#!qnYt_ - \6++"_22B*d?rAu4E6JhAB25Z:0fH>@HQDag\-+_U![QGRU%hD;5pY(22WDoa'_6e"L`mKY - r?WMh((FDc1\2h_;T>hY6GLX,KVY1`a$k,4Bp2co[1?Pk?ZcoiV*/>hY2N9iU/QcMGGtYcp - dU2I=\SA/)Y^K.Xm]Ga,BK`rI4d5Y0#>^Q]A$`l&2^#>3CE2BOp4`/kI6p67seb\ZmLa(0` - Mh@id?[+i$)L!q?gH&cn+K%2:4a>ZN=CU\%kk`[6p^ElP"^DW788dfb)rXsqI8)Y+K,+rBf - )G9du&;/mpM"g"=B(Ig6YSJl,`Yqj2Me!thJ1u;0FUAM)&4@ - 6>`98X1e,REcF2iIQUsMs)Cc#!W!)N7"EY_Q8ao-T_$n?qe$r!/e7CtO]aI>h0-hdhWO7=m - 7TSIg-E-ID'%XMr(hu_\&>b/?+^Yg[LojqaW*%!Io%-?Y/K;nSX=rX\7+_SCMZhOtYZ3*cO - oXQ,d&^eEW0Su6qm[>;V,+B4SB++jDfq.h7m][!L4n'#I1ZK/N+O"9<;OTIXE[(4YkJAkFG - Fg-@5C+3)'_ecA0PtlI56OTg6l_0(dd(R2AjUL7=)^s&>`g10r1ZV/5o3A.Ou+`Yndr1;_[ - PXQB!D-gaTn4,D9&O#1ZB13p26iL;Q.10ILQcuChkbb-3_V[W/b-d=>`2*h)k!V9n - *ZksDUk4(kB'8.4J0Te@lCE0CVuOjn!&4%6_gaSM&Rn+@+(oK$NATp@J=B[.L\2 - bRk-03_3,f:*FcD,%RO2eM^>dgC>*?UW"(;<-43DNF9Z-WKbQFg/Wb - ;3L7+0`=n<N!SgObaZ$;=,NUb5j[Snp>D - @B;2IF^s2F(3a@9]7f;o,kRHSNNjO)]?'@RI@qp"'t,QJq^F*i?'qBEW5^5>g6jYT@-tPYb - -Cfph)0*fX\%X9sCS>3AAr)@L=Dsoo2aG376?XFUG_?c?2] - ;b&0F5W/,Q_G^&lE8^%sS@"*b-mlNC, - [6@UDjFS^8_L5o\&QDc@mpd%N/OS0Q.Lig%Hl[i4;^Mj'muhX]gAfNkH>qfB[+OOfjj>3RF - pFO$T13lbN/o59')'lKF$RV;/(Zb`OM&tM.5"&iq/_0NEo)*J=a(LEY'*L\o]Bt@_OcTP,2 - YDT>DC978H`gkQtUld=.uNqja#E5M`.[FEOki5Y)>h?r_9!Q/2`QHM%D2?%*jAk - oEAeNsM/P5M?+lBhg?k$T>4:gAm.KD*eFAUa$Hc$oF2%X"b#d`LSK_gj\/o,Cna!PZ!G[s. - Aqh_9OSdZXsOq(Tl45R_s#NV\OifU0:2kf*C7DY`qTRm\UoUp3Vo^W69Q(Yi![BQuS#j7Iu - D(2-1k^>H;oXIG?r/JM5kab]Y:t.=i1q1JqmH^=il>S4l)55Pu=gE/kEXpUMI),OMQSBf%E - t@s#!79H`u3C"%7@-[]b.#3)in2nH3q5p-E7'Nc"Lh=LgP]nO3W<&B=@Z(O>P@60/BfZiQn - DseXd\2o/bh,eo"^A1<6[jL=pS&SRR,q=S&LBBmNVI1Q",)EbO-KHSRG]K7FOEimPS,'C`c - C3oXkF,64kto:KhG_gJ26ih1e%BnN!T?t>=Rj'MNm[\k0YI7<$XT)g(QVYLqnIB)2"7;fmt - RgU8u`q>6gFE\-D'MF^4E\G@b+PC>#o(iosMaa6e^t;JJ\n!?sRo+U&)F<$Mag[KG6+48[L - R5@>D^=-2nF7]OLSeeX>:@#OZJXa6&_FUCVdD./5_5M.f$ - L3Ee;McB6MB%e;"[h?9gbbRSb:VI/4M_E+;:6mJe%G!1.9l)T<'8(F]0.r:]h4cGC#PX5S\ - s.64c5oGR\>6Dkc-=+St`%!/4d^@S3?c-WfRR[)=jC\X0Ybs`:;'c@ok/_kE&X+OE9ZYdm# - _%beCpoX)\9BJcmTc!%XeU/&DOGP.dp]$*3iL^JT#9@'r4?p]2o@$5<7C9D]60r'/S*^Znu - epkHQiO2)_u1O6&/R7S%59JDY)Q5O`_$6uh&;[!#=Y3PJDHLR0)n\k?K`$h(9ZN['q3MK,G-A,8+WU/USk\[T8G.u*uh-!"FgIU*Zc;AK_e@mg`VG)+i5_J_F,o34=.9i- - Gk#G]@4J\UVFmc!(+j]1A!2j6SPhd0f(W+]SoV+FI8(.2@%*\6[@'JCHO%+e>Z$j_n;C0"> - rR2h5RC2_ur@_>bIZbcCSQ74etNRX%U.M84lj]^#Ven"&V6,;Ecp49!kd^oMCVp;340/&7a - r9KBbY-<\q)K`Htq1P@);(@)]`e59sOL4C6#%Ak!%g7N;,`F8;]VqPNl][Y/8-i9S/J90`K - F7\\YTb1qph!=9-b#\l#^;)Y3&!2Cu=SRN0JWPk-L,d:E%LA@oD"Oss^^^4`C+3@lRX!&Vu - 1iCB7lG$7X!>iSI)Sg`[qu/o"9Id(_mZ,si_C68XVB(nsRJ.*1Bo_LSaTP - J4?0kfG?l6JF089>n^M1-B>.__a2E<:lu3c7B*f$q.NkPat1;SilY;4Tnb\<;a*+TtNf\]j - !ogCdLqEmmK-+SodCh@nSu'jNnnOZWsRR"A?\Vik@Lr:j!/(]Wj>AZGeB$`B:NH9KXgn3&@ - Z2^=67Kj'P"J>;dF0^FNg5j(,nq_S94)5ALeL,\$hMA,o;7!3Bc>C]27tECPb-`gD-CX::D - &X+tp0`0d+me,iU,E - 3[ClmiI^_`^VCCZ^nSGfr"(=9Y3I1+_GW%tK#j$r8>PE>YnbQ?U<]:oKoG>r""D*V.`/5:a - MdMZ/1s%InA>&W4BjSY,;_bN$WAo\ae\Yp]XG_I4\=s'd1oR0JsT9oU:jJn`#D0GLt'd'"1 - 4QO]t?il`E^t,NDP8d7)Mm?gJ^[t@FehF:t2d.N=RNk&Be>l4Ogh_)stB+=iIH2^DpLe1Lq - 2Z)FalL7MQn:!"DU5#L":kbVT1F$ti75BM;rN9Q_USKJaHOWN[R"&co,+iM`*K+=-OGR,QR - BQm]^()S1/A=E$E*J[mFj[oR@'T3WcM#tc.GqiJ26)VO.&1,0`5L]c*NRE-)".hR>",F3@, - Kb?*aK"[6@JtuMpc<+@ID!0;J7=YP2R+..O"HTj`^I#:XeAUgt6/'F\:X:SY1JNd(]i2&p< - 6pKJ:S^'J]iWpAXdu"cZo"O76pSFqf37+ZHF;U7e@eLbFJFU - eG+]oXf-\gfA,NPO;lD?O=:O&J`gnq*54`/H"(=D.>Xd-55=A - j[,ed>:^K3g4bRA"**+[8EA^!;^bXc&6=EI5MH,(/B_aqQdM1$)Rq]^(HPS(-U3*"XP3??S - EVPkH(Hl-0PH_"V/R^Kb6Ja8P.R`<.!VFk#'_^<5W*4b&6%&?]/>[Zih8n+Gi27-BV[FPg#iGeD0O2m+jqqedS()^i@LQTZk*QhPkfG)fj;s=HC`P,?rYu%`T8G - Kjp]Mt$n`L[6#;FGs,aIf,8(]PH!(5`aMo?sJL4$[N@b6@#GFaE$K2@'r9t*]S(Z%Sheerf - oI"":T\lf`g)TM%(^&lahH3@\-^atoAmFHK?012mfl9s,j(SP!T&=H_>HUB4Q3jmh$WU1%< - FksVG%>3Hi*cK_?(i-"KC-nD!)qgiJamIUor9LEm7?!`?VU;mGieaH/ - t/9OFDQ>`dHt#IHTaAkOsDgac&a'LB<#;;nrqb1T<)_"_Ebt_3N5AA^/E+E)D%';4]LD/i$ - Kl1L2k\>t&pB1h>jqB!#eu)n:+f!c?@+`-R,`9H%S^^tF - g'+0LSYB)j/"fY/0aJf.l.lp%J8;$nlaFFga_+k-"^+d'Ahe^EA,XH(p"L= - kmZg$PZjmC(d:MkliLJ4:]Q_6KZsDCmoX/mQqFh!GqObo'dkN*R3Y>pbS/eK.T\+DEEQ?%m - T1Q$Zf4a59QQMOCk!);Ir[AR'Q$K"cga-mUiU+HZ6PC#]i23tu")B\mGPhL:4FI3$c[+uuTYD=pY9Ytfu9lS_c/7Jk1@N&mZP\p;%4-n]KT - gi4\SnM_-KNJ*ijhB*W.li%.>*G+]_fBagkai7rZ7VHU>)=cXDlucLd'`_Gbr+r248rX"sV - ]PD0c;m'0ekT`G<"841dM`F`T,\QGT`al;/b8'Wo(Og/#;G`c/m25-_-#E)?7e45X#eG+k_ - :_RT&]%Cjl7C;dEU.fh:0j>e^=?Hm]G*sNS3-jm__mn,pH,oGX[oqS$A>%=C(>UI\(;RSXh - \rRNA*d%\`HS9o@))(GZK]Oi;lQ;8GioRH^B%0.N)-a2(PKJPhotO^=A0AT3p)E2Kp[[J3; - Kq,De=:!$VMrf9i+/9^f`CH*QBUd>V`a'_usEZ!O#8+]G+"+ls]#n=;s_*`MAX>u%;(<.M&FcX? - 'D,kuWf]!n;Xa/o-hXnWBN0rQF%-[L'EO7qZ0G4bV)#&*lTc$(cOpHB46:(t!fVfF\6m(Xh - C?GUiF\`[$BHcseH.PVeIN+NQ.HoJt@8&Y=,`VaAgr--3ZA\EYIVk*p[f%:(G;\en3kP1#P - bIu4pe^4*)ddE/ZDP'.-2XBTsm-.Rg3F8[f&d'Vkc@/$W=I:'Ep+*ujsq!O:,ck,/sj; - IpZZo\02>)/'/sH@q^]IJ;p5O^%fn3hXs7fsd`!\"muEOmp+lj_%r^G-p@aN"AS`S8NuPFF - \gqp&A[us)8o!/MEn#./JGR1]OcCAZGJ'`7iQ7Cfl3E+A*Io`XG1e"JJ-F@5]*RLasZDaJ8 - _d(Q:gn;7P\14WfbVA5YE5Q;&`k80/DP%(.<50[*!b0GN#@2_NBQZaJlefft_JBN.#=(6(h - [;JB+AAN$)QC/e/t1TaW78B8JQHa'L>&@YT-8mgYeJo8@/bQRB"O=UhC_%99T"eAJ(SHk - HWMpP*-:oiskY:jE5=Mp5GSHbWWA3aEgKN(X_MeqTXc,Gf]>o&)jLnbiL0s!?:]LN#sBubo - IHoae",_Y',OaN,4J6VPiWmNe#=3HN)Rf;4b=@2HU!KH$moE0NEjq"d1f:i7F=X>+CMMfc'$$k@I(df+lPQ?).gaW2Z#BEipUrmH - YDY/1!p.Cfcp>SS-0M"&BQS$!?h%.Zq6Sc[l;0b0R8EV`T89I\V^N.*d+b*JEA7h'f^,i\OI&6AeXnYf_kb,=JK#_ - m]?oN"M:^DUF:12jhhGj%Fek[%3/CY]:WG_@qt4&g#HcI8B,35p*I;NDs#2,7T!n:+=EW-W - q_ZjKkhL:9IARfg%YL2-HtP1kEegihVg5Q;\-):+>J:k9ZA"GcIn+WqV[XhHI@hp!1,kM1V - sD)T6s;Bk+iAPkOFFJZqc78BEkB-0HZrSEn=?:5#H1!lK>Ri[@nVL'%I0CJ - +(-'eV%#0Qs#A?ZlA?;>d_E/![g\k%]fjX3KZHmlI)mn7.8H5(@n2+G`%E9XWR - ',N30gt<*!m@DY976[LokoAoe@,S$8):V65<@8epQ?CW1l/#Xg8*)Fu;D-p#];7:O'^NKGl - ADs]78iZ@CWKO0-seE.kC;t)GC#P>@_H`FZ6%H<^_e^/'O(rE/4AVTo:j77)]o(_o)W6<+b - N%\04nkIRpm'(MGO+7``V&mA'eqO*;`ZLi<]4S(cN@C>]"b'XBMF.k1qsG;f?.Q34K*S1<+ - M5)Var*!B2::gp&ST7Qo);q+gP;>*U?_CSm8]G"g#g4"&#eYKE8nU>DBk.W9.(^%/W,b5B> - K0<1qPEo-afWoKT?`>HBjj^R.a&RY$.H-fXm#N`Ok%P1>4SL-hH)9<#sm#E$jPL]o`Ja1,i - Fe"%cQjPQq;*`DqV6ok>]<5@VE]a3m*EF50YE - L#K - MG?7];9-,-p^@ef0f'E'80C6@8h+^^`IFDNgm)["+;m&7mj`bpI(W)[$G42IT - L1cbC_mA*Jfno+2rrGS=p^/VEZWH]du!R6,",cDjd,;DK=F2d4J3'KTKi]PM)GdH$k^htWQ:6 - MAjdWc*;Esjq[]WA`_K85&3LJn9s;REceAQ+4B`,mq8:"YjP]k]VY`%m*UkI<`8J2g7%;#+ - &C=qq&825DCu_Z\j9erX.U:';@e%`=nh*i2DH?>2>6FAV5gM:!%li^RR-*e-Wm&>mLLasag - :?EBCsT1`U"K,c)Zg3Nq^,(KmujEl3%W*5"@KD%&54,uVYZ+J$\Ej)-Hq/*&Gsg02=NNmcF - W[$K%gf>kcg3pY@?a4kip=Xl7L#N7,!=UC0G7$LEWa5+f^L"QA-QS6cFFn`MSNI&H!uSr.: - 5G:V:6%W(]be7jfjL,2sO&I1h@!*&2"*_9>r`[OpsZ5Yo8C&'VhMd*M14&93A"n(to3'].( - MrbfmXXWF&a,bArFi!:1JlSO2%8:k^m!$d@&EO];iG#\PT*$i1#W6/2h,o*8BM'f5Aklr-t - h$bs8FE$[b:RN&>m2k?1%52gbcZgaIC.q0p*GCWOW<.HegE#2aoj`mf#pDAKPIIRBYY&R(&]bmtul-u+MGif>E - r@TKG';om*KdbktK*#K>33Pg,!CnOYEQS#!uMNQsWYFR1[)],X+lRgi;1<25H\JVI4_G8&+ - nW^oX+RKc4m8*BnD?e$Tr8@&Ee)1HMJ0pH@?nUCB?o$Y&JWL_tNA88,VdY9>CnQN6RZ+PJ4 - Ar,LUu;'t9fhmM.?D?Vk=/LWg`5n=M'[R1bb6cmJN3oON3X-:,]Zc%ZkU=M4sZd(oB@H[%j - K=7,7[8r;E0T;:utSCo$ap1@SI/GOYmY7k7:&F7t+19ZB0'0CfAOoZm]c\_(Ph(IR[ue/>- - (a7/Jb@0N1(^jq*E4+@$*Y'*fp';iDR2rBc']3Ra'Wd99$o+Cq@o3j3TmDI"cpY0B\Hc*OZ - +XhN)aC?eDH\b!QNZs'HF;+]l"2Pu3BV7&^&F$gUsOhL8BM(XuM$VF8VGn1cHjhdh:)a-@[04ij#)f8)3+AJmJ@e2- - LGY"mEqlN0s'<\YjRSU;LiU_@'`e.1hU5_4N!^Vo'f->(_rt0/n&q$Af25:/;cn(FD.dQQ" - a9n57sXHA>Q/NE@!WoO?(-i=>\YF<7O?JO&`'?ap@>DeX8>em,RA1\+B/9;DQiXIb/Z>#ZL - fcQ#0a"2aGek$.<"hm(Wm%U2uBd!Ya0<'K0R@pbo);>@B0kF[1CSOVP)D98!IAc^@:TMIbe - d;ok:c'O`W4DA@=+=9X7M6_-3!-q?).(<#:Ek^okoN=;m/`PR+r1Cge+kI"EIq6 - lt7VN'7^Ve>XG+US,jB>&+&/!"N<9'KWM$#?*`;;'W?d&I+%^=cL[p.G!,o$kH:ZYG,m88r7;=eDX;6&)@rl"+jSH - *;?EZe"?mLqMK@)P'-AUofbS;tRP"qp#dAUIG(3f((3Cc<(oO.:SBUjR/26;o$p'o%b"R;# - +mBXHegFQ6\9/e/[_0dd/.Fe8n=V$F:_jNNk1P!JT)'6//1>RkH=bdgu=EqH8A4:%bs'idE - \2HEjZ&=8)^_#HS@p0@\/NmoakM$IZ:nOp+Y9k'K$6WYk9Wi'qm;h]`8QadZp]TQtVBiYc[ - B%8L;QXUQ^MNWZ7[Ob;@]_+tHoo.PrdnO?"%ebpUp<&;(K>_S(m:cSCJ2`U8Q'`'!j:/oLJ - MukDJK\--N`4GHC1Q6b&U#H-3$5?@9r8JZ7B8Pe?%_m]'8.]bG+WAJOB,>Y<:jTZ`B95m5W - *_kB<2nbN!eBZdd'U.Fr52-pP4"?kh%P@,@5J'V`eW0/lmmDp1]Fr9kAPN&beF - f(q`0^!YDmB%!_s]3=#`_%R0ikEY9Z4n@Z:AkMj8hY@7[,rjKOK\H=P^Cl9]7cN\HpH<5Xo - 7Y*0D2#H$B%1WfP%7B3q^)naY.7'R2(TM'I]ecuC[E[uRsu2AW5]C1BU;IQa,=XY4]alY#q - I2:&e*Gi>B!t;db@O>(Al4D4&<`jd'6XsW>2jsHt4Ui),W@0ODT\^6?D"_e6%skF%Re9 - IJX2[-AN<3l0eK:n"fVrD@JQXd25ol`+&AK\k"h?+P,DsSDsqN3Vf00pI7G547En%BKmb!4NB("blfq - +qQ*$q`e+$MtN;(Q:\&eO=MV!S/M;2.d%7J@m3l - Ql/'Z?rt93q_L,OdlW:gn&4R0$M!mPca$rT4gW&Mah\/#A)N=^m:H@oa#AfQ=,^SJh83Xn$ - =&7J?rP.QH*%ShX`^U-Fg"$@iEKLI>F\PAHLBHZ\W^*36$I9kr2ek)c7Ks]d1#O - )Lg`HAd^,!6.m*A2rjX`6D[i)eKYn9Os(8E+j!XOrtPiJtq&e_it&"=+:I99K<,R`F:AcsH - 0;i$C1`rZNA,h'2`e%-pu^/NP@2R@t*i/uZgrPA3pAU0V:PW(Ra>8E=e27[ZJHXb-ekD%B8 - :gBo&]CUgTp?^,o2DLu&QJ#0%h)?,.!(HBJJ3i"f>R+QnblEgL',/T==LN+AoEkMYS7$ - 5+^jY(L$<5a^7AuMNe%TAjl>skYAEHKX;VGgUhdq64%:q4c#qCoP!"cV%?o%+&NB?W:V9`(Ef@)mC`'Y3-"(5Zi!)CW@Qq\T#&c/,AM:!BFCIr_BW4)m - r^Vb)<7t<%!cR=m'FOY;GniUL(5@ZVEr.N-6sNI#<;45Q1k'4Eh7IL,l(f/O;;+N<0 - DUGE#4?`%!+ke/^_\q^H3?HpaIlJr7>J^U;3biWi#[sdjX%!YC6JP\4d`Zp8HYClLRLS7iP - 0%'CSj2ubX;aBZa1W`pnODR=0U*u-n."R:-@h&dnr])![8)p^3&roM)P7])A8Q8#Z$j=bo1D<1$0fTqc/'ph\DK[D<5&_3#:'ZAW4T>**M5$!UZu;D+e*c - G8GtYVffUOheqc/MYP`:12mWF&pjp#5a_'SJfp[&/B8BD#&KG5.%na9Et`^[q5\m_>i$2sm - 1&lfHYM=4QU\/@g".hL(A+l`BN3^p[f`b[96b70AIrS$'ObIdj"pK?hG^bKGga>`:[XQEmF - CNFq\6JoD+!,=pW-YPQ]+)h-Mc!%Q"R50mHj`L+!6au5f*=CIg."Gi+)oh"gA!=!>2O\"C= - *DA*4"Z8'DnT/*u0N#3^/Z - %$p,8"HT(Wc6But,Y"??P7EOOB;?^D\mcYV@mj/<@!H"qZ#"b6bHiH''(Dup'eTSQX@jb]Z - lofZHFAebQ:0)9l>lD41Y4ppE_9p-5Jn%;6qB'=ggF""0u7K>,7GQboudu<_q%jReN'#jRt - koKd3reM"+Hdjq6/=iV-dCpFo/kZ,Vaj45T&3LnCBu$G6)pF)'0"aEVO1-MnXH54j?sZcNo - 3oJkmdWo80]l2:)(>a0PQUn&tF[5JS%]!=Q+T)ZrAIbk8B7?Y;Q7rUFfXGk)eY5_;E/&5On]U+-=_PCUNq$qY_!-=kVqPEL)b8bk - Y#AJCo'a;L'JUumt51CkOh$6nOV9K - \!ZFe+dUt.^JM^ms=([#oD[8Wf2FMZAJ5?7mKf4)b_1^ilJ9Gu73RFn^\L_G_!Q-Q[?9F6h<-H+i59,[grBGCUtXe`$5U:=9\dXY.d&OR>"lJ:4:E\ - Z+U=M7Kc..2:ZCJFFXYG&lT9+Erm`G*`RD@*"iGVfZJJL7mRoKFj'W)$9)q8Egm-C(i:A$5 - b8BG#00H0TU9B&uR?j[o?FL>97liWt`U=GE2da4GTXGJKfPq$2f/]M#j - 8J"SsVl;IF:NeI?RVC^%>GYE52ALC4(uX:S(0L@?Wo+M8Vo:j0+,/4nLi+tp$\@=eXSl.L- - S.i2US1P6Ih-j4uJ<"`biCDi_2V$J119i>h'Np<6Cm%`[Jp0'3_`%,e[J?=._L'l - ]),^3#YL&J?f6`M)Z.iQjX)6+05H]^/UD - g,<$XnE;Kg^Y7YC`4b$fa6PXu7NCM=".p\p/3A4rM>,[hiNO@>ld7Ih-eTQ%qJ@P='ab%'e - S=fKbiaA/Hu@M74NrZn*Q"]N,YJ1d5IF!7#M9K*9k,%-;`+4pZQ'$8"#X%L/LqaXm)jNE[t - lRJ,6Fkf:-aQT&OSi*C"Mqe^2YKbamNT^Gek/VU^E;*j/@ken$`/!.s_Qur9p\;&Cui&TAd - oFo)rP@d+#Xu/35;XFk+(MfI>0N(,I/@qQ]aj-JkG]ebZK$:>j_:q^$`rM5gJ:6H9]8dnN` - 1_'g\92=Y]ZRbV.eD/k!jV(WbhlR(7;Ar[r;bFCc!4"Ua=)q'c*[_o0P#<>80Sd\8=2H3+9 - [P#0oKr'`;scZEpb1kLs[+gMEG:1S^?n1'1]SH#_LNgOD2,7]@UH3U([E4@@GL%0UH`_&D8LrpV]`429Mif2?CC0;3=BX)^c>[16>>uJZM^8huki`8p - M>@(l]!Vt5a!l1"l+3WW=>2b4'ile)C;3ld/EJ@#")F9")TPf>2-O7sT@lksjO>MkUYhaN, - FoK50HP^2YSX6[+IaQhR<7ck0%aFOHiS7$-!J6jZ=_,o*Zb'"[n"'3fGQ.W<_Lp;DIMLNeB - :IF4O>ZQggVs=q/#0_qpI3+>?pgsA!0SCcS2h,s`umRLEmYB?RP@l.RL/94n=@P6KTJ$k9>NA!!;C;UQ_jbBd1\OY0nr5E\FTca - ;j%Y*+s>R:m@H%>:bY\jBC*i_$i"rK`YG!P-r)K.;F,T;"q'Y>OMs!"_Pg8joaR7(c2]bY: - L\:.4GE7/TkLlpIH25:!4N6F9]H.=\Gg@]9.!SWlsiN*/T>>",Mr]`I?#;C%P6%A&D$SYG@ - %p`7?m`!eC=+L0Cg9?SNd%[/>T4=DM?1,>GJd>3U8Vf4niC3YU[H*\Bg-a3q@)qZ(fY:&gd - `CtAD8VOk+KEnKc-sJgNbM\kb5+BGSL)I\)Z*g=JNs:HX5?QSg>%E:Wi%fO@0LJ>r._mdfE - Z%7TU!nRMpq-mund"CAQjM)td,HJN7KbK3Rc>J'CghnL+0Me;inrs_6KN^T2*"]BTUo[BM'I/ - *ugCBV_cNrhsOfM0puYo;Y_>sW>)>2_rt8sM(k99"?25*MS,JjN$YuY,,)= - "'6GXrjLi\V_AH6'/lRh6C*tWZUH'O_U80N<]'H*=m"^8+LYJ05@dlCH1G9]:!.$LiW0bK^ - T":]5&fF?J8O+DlJ!X)$Zr*fja[7`Xp-bR+!5Pt"8g^9HkKWAN:&NpE%,jr$i_D&b:-@SYH - ![4j>GGR-T)i&^JS$0d_+ZEG+peAl+nD^"(Ja/ocM.H:$_78W"j\S%:H[K/9_D1dp.oN!:% - [8+ADDu,=iK?lY@GltWjO1b8=\nj(to?;e*&p@`&*F8SYC3+S8*jid\hH@`n7!)ld`1p<_$3e7b5jYA+*2gr:A>["l)Op)`;u.J - "<3Z1@$c)"eI'O$_T_b[N"pH]o/^1.*n@be2/S@PG]A3)&s)9`pmc(khrV-,a$.N)<3C9TH - i.6^iRg+dA"[!SK,Ia-g1"PV]9f.CuD`rfSZQN)at$9m'NCG#rO)=+,Z.+N`K=8@KoaXPNh_+s21:A=gaEEJd+6*GuffR8QXNJUc.G+NID3hheKO[C!ipCH9` - R9KD"/@\?8#fU58%?h[,nKjc@gDTdncrm0a].VHOe4/KK4_/M%'ar&,28A7'=oD7G"$8[4G - TnZqW-inT*.'k"5Us=P^H85`8]+(:5rDY*$*'&[1leP<]@=>BVOEd472DOgN$uPD(]/ieRK - T/H%uqfP6g3G]g;HI3X[[n1W`\7!JVau%WYc_4g&X?7r@l#%1,^Xmg]<)W9V3hP2Sb5b&53 - E\U!MCH'gHDN+"TUOEt5&R<0S#\Or7sr&u:MN6ej\"O?h,*R26:ZEAZZJV@(\B.[?!gX`9N.'?r%Q?K?;-S=\PneHj-W2K - 1!J]JNcn:PMQ8Pj&E^(:5(=GiU'.\JY$/8#h@l0)c'Hq?5\jWaTWKSq6?iC%5% - KTrY!amV_?p4^$1:8k4tDE2d(h=`lg$A$)kl8f#J - .Sg"Y1CUiYJ..S!4,;&,h.9bLW('3\po5!"94(pB8N].uuob'F_"im>NA))Y@WQK#dqC.,I - -8t66I(`ERZfPP-OF"-*R"q^qO!rKXGr(nLjZ3//+Okeuk!u%6^(jU[pX\rW,q-4S@di8ES - 1n[0a?W(l.Yqr0'D9kKqk#AaU9[GPqYS1q!>^4)=#$jCl:U*hD$]HPX - P(CU,>Kc<6`k>10`;d9i]Wf/fc5Q$YLqM>0[CIG[A^n(Ni#PXp#3%6-VOc>cN0k, - r"Q_W8\QoZ"cNP-1qQ\:p\'Pe"aNJs)?FK>FOc(ib>-;?XQu&*>"YAh_%@+TjoLDO\3$S[EN2ZW - .\?cfUn%k-3:r`jQAc91b^K8[_?1=U!mXB&sGo[Z$pA/,knEAI^P/-JRdW/>Wh"OUU4DUi_ - 5mo;NU1n]9sX/%Fi:=jOZH6_oSi%O0LB&^IsToqV&hR=b,PP8uJY&!q7u%4LG#QIuQCD;Hm - `9FNB=?MQb(Em.:#?B00bSR&coajSFAB<>V*`F?B[A'G8[cNjSekQN/HgRa?mPVd%q)]]>A - AesBEYCW;1aiP5Be<$q#*$LF\+`eV1"S",YEBb.W:DIkV(3+7/EISbj.7"RdOjHjh'7B(`N - qr4tOD0gY:?:i8#-=m]!>bj6EJGf[:F1$g-?2oj*9mnRMaOTTJYYrT,T.i>H.cBlC72<[*) - ^_.@1XY5of:u;cQ99@&Z+0W#RV:Q=i3#\0rsV/%-!TpF1U>rFEb(1UIUR^^*DZR_M]6KFZ: - Be]>8)(ofa6t,P!QSl#8I>(G+7bYj319 - dQsCU!VEWja6JU"EMu",)R<($;G0BVik(jU9<1BIPAE[R12;q;E>Y$JM<=N^3K!WV(\ptc"#uJOd+(d\EO\.$c>`O'p$qN@nc0IJ!S],'8iLtcdGd9*1BZ.d>m\ON39#&g!(j: - qjUF"UgA.YU+pU8HKQsi[/p%8oWj,D@r]d+)V3L>.H/(C\kBbgB/GId7Y=2Zq2 - olFdW^YbGGX?MG9)*5ngG<&k<3&4IMKu!U2'?S@R6muQkZN5#Q^ - q.FFkK?`csdq'NKl#iPbMBZ6Y9a.AG$G_h'`-N]SK3.0JEprK9D+dWn6X<@aA.A^^C-`ap` - :9iSH?XQ5:$$Vs,gnkB8Y6W?oe'R?5rPtRuQC"3!57\s%`b4!jW5N - `Z%62eA/LT/_,c5`g6J44YG%W_l!(d^,,6$/-8lUGet6c`-aj<'NrEmZ,XG0&En#S)03^?_ - +um[c4BNa4TLs>):AUD^^Wc23j&^WRZ3g"Aa6O&kgHMhEGYaM[%[Y9YU7C'f]4^DBQ]X;G'Uqs - &QPQWUl!5-j&Xbd#Q#X?U*15..EbV#Jq/mgD1)TC&Tn94S,e(W7,W7>EXA3(gB.Nj/b0ml^ - BM2096A#al'Yk#K5kN,Ebereo<_ZBs\L^J(I,LAV7L\KOcHAJj,_er7";]>#m/X=%ZAQ%Ld - )oS8URMG[(fF5LfL=Y*)[Oer1[_(8ZA[b)PsQu-aH(8R8c'GN?h1oJ9a=OEF=?"H'Z[kD#c2IH(4"SNVU4"4m,2` - Gp8:!Ao9Q5"'FNVOW$B,#F?(NTQFntiS&PA=L%ItTA%!T?d]5\:^JRk-)$@r,5mkB8K?Q4:;7RcqH2lI*r=DL)N_4dV\s/6#F4 - V6WBD^Ac.)55o%/fS,Sg/r*R5Ui0o@0k((=*(lIM'NlEm?ID]po$)f,[K%(NW$^!)(`A!P5 - j;hOn0eOd5^_!%\A-:&h1^DY=Riq>T:+=FKVfL.UPN%#pXMmIR69P^:dYTC;@:#o6'HQ0XG - !N%R@#^P1$[JO'VP69oVs1sW2C-gCaS_OP>^o;]SCYfu3c!YVE>/tI - \WA@tS5[.H6KZp%9)/g3%EPlAP1Ei1I.8X5FLi!XSm@,Fj[sHj]K`Z)-KnscLef?;#/)q"BPR(PCX$pPU<)`"SJo29g!.eJ-HTi+.rZi)lbti.!:kT*4&LJ43R8Z.\9kXa - Jfb.d'"q#Md.H26]88ShDoK""Y8>no;(8FiTOH%go>`,TI`Q)bZt/)V">[:p&_ - /"7QpLi\$)b%E>I&i[8dJ$tRdWmd9P'%_3tNaZ#!/>M!Fh7;ISL9p8nTASSA>o2cA'4tgDH - l[fWQ9)P,UR_lY`<5N3^ck_VL^#9t[f_mc'*+2\4;`*,?HL(n9H+*3&1*JDq`e^@r;8d1-V.7j/uddW([F$mI7Y3qd/72r+NM1LE8DIhi_mgPC"6aH)A3KW?)`#;Foop,\P#84*g4@kG@0aP_qY:$ - Pjl91A(:e$C6ME#5XiS6YR@Y;9P0im-\QY,X+-,sRC.d=TN>EEkEbBbFcpq;hkpFldSC)L= - K@4X!bhg%aT,r+;B$tTXJZpQ@?K-Fi](0\gk:m'dZ]RC_pU8tr1AY%ho=5q&(X=,(c[,C"[ - $ql]qXBQf%N9P.Ek'$:oZe4eS4NGEr+93bNh.PJfdJSlPSm4aB7gr!/-q*tiW!KQqaHWmfE - <=)PnL@b_=5H>)-%\o-RLN;4$8/U8;QSaABlgVX!)pmM?uk\+j1_ESPL+UlKqL7;69Ns:H= - !&"U2!'HWD@-'G52qQ`oH!W>#^)%.7"RhHPV$^'B!HaGTN#0/I.6IYV[/!1Yq3('<,tE>+V - >6S&2O!..sE;?0L^EHSNA/[;$+NS2q!a'PcfToFanDqY5!nr?%JIqC;u?lpf.&5Y;\VM]=5 - jBC_+CW.m_2g?UTM+M*=[\;+q6rWnlXTs!/o84+]I[ON!Hi\[;RVEY6-PJ[e:D\1Oe)JGf% - KdB-q0)eboSuh78M%>+RKkQp+P_"_CGDmSTTVVk;:AATU5c]c2Y^6W%Ig?U<#RAjRMZduJ\ - GsETis]8+MnJ).^uN89#r&7aLPFlL&<]U5P0#E>?i];f3p#Tmjrqm^$hRnGCqm,l'J=K;X9 - 8W!#j:>DAEQJfYj)T-mZ,N(\>R\V!G^l^&lQdV\;13rm\Uq3`=W@-M2.8d::A.0]#JI:Clk - J#Ypu8=batuaDCgBWM=b]MpciZ9^ObYjd7W&Bc8Nu767<[C.*@K&:e)c"Pq?g3%(p5s!X,\ - D25=L&B3M,VDXqOEG!P87MINGY2"Q[scZ(NSOd\?b8>m]sH&kdIb)1L@>1&C=dEt:AO5OKg - *cU>[eOFr:6jdnofOE%nN^Ea;hI?@,Bag-1:],AI^fa - AFGM\_!3)MLg*9sRZA:]RfbB)lK>!3cqLNOm.@i;L[tf#9=YLRrL]Sq/2$mYV)\kg2Sp0R$ - @]$Ok+CX(H"c;L.Qq[49I]#u_#kd".9\7HhU8$&T9`K*.*.BJJY-.q6Zlh_#Q%/lLhr#LOc - +Cn!1n,g_heV7d27#79M<$8V9.P6tVnW6k!7$S0qole`)S^0pHI^T-SX#$D - ,Du!VV^\mf+ZAcp.dll".hWPT_rd@*(V,QOu@lF0L$+pI89,e`gBZE)Hkuo4Ag2X%ik-PI\ - gl?o$$86b"3HXCj2mu3YR32PNjIaTQs=-$L_$C8s0W2Y^9<7G]J?5.C0us#)jnq;F^#3,Ol - cV`[aqFTh!&0D14#DFFOB8,!7hn=0`F4=UV - nP"@]/D$B#TN2R"IVRV0#]W@q\X_*fS&7.l+XKY(b2Y-MeDs\jSnCaq9-<'8H12P[_pAg"e - gI2>J$U2U)OSqb`@Zj;2AJe=c`.]SCX_?*2@d&5s;QX_DB>c]pVrgRJJkO63_C-%9m;242e - H`Cu.u9cuY54lF,f-TX_5&uu8UF=b+&Wgu;Fu1pa*XYbTPDp5neAt=?'Fr3W!pFRBr]`` - W'_A,hdO6HH)GQ7UYY7OSa9]WCNWg1#4GQcMNulQ)gaOf5(ibH)%-j^N2a.a85'=nTP%d,i - #5$lid*\qnkG^\q!;8.WH^);fXAEAYb&F6g[4.^BD9>?;=LEe],`@mfkBQc<)OI=98ZQGrd - `d%G;RiNKE27fF0>^WoU_`2[bDDOEaa.UFqEja..nROGM?n/P7S76JE9&Xp`<>%S4C#f<"> - StM8h`j#%'=&HPpZoeOd@@NRS3,;s"\!9&nb[MY=d5_9+lA?:^l*!HN>YAA:GuO$.bLVht)%2^4$e8Lr - Q"*j6bnOsl1J@g*M-j>EI5CBR!+nRmbSj;KT'jPM=mkNrD2?,>Zu@n$0#f0TU?KQ+.eF;n2 - f)o,Q+Y,E6[Cp!5W,L@)($j>KPS./=RmW,`D/?MstH`oK9!%mYK#[;PZ\<+>kns+9))L9u:HsA3?M$-/5>r/(O',u=>sI]qJObO<1rXF.k_Y>dE9@kB..$ - E$#lHSi*lIX$bbRmgQJPG)Ig1[LME5a[qOp>k2TOI=b3&UOcHIOPn#A(%`e'Du,(:7\;hMY - Aj7IbYS5#)S<"-K-?&5e9LDT>l%j=^]2+teVD9VHm!6I_4?h#o*I:DiLt9Xt\1L - mok"aiDnf">55KY&;@JF2iUWju@Gn'Ej8'!1B1AR@BVtT:-Xg4?uY4l6qUol$+Ce>EG7OZN - @co.?Z^/):t>:dYAK"8L@o$"`ZhoLn5oXu;P=*$=iUk6Dh2"H'EA%*O`1I*a - G9TL%M3_)>6uMIp*`>D=Au"#]Kijc2SjG'45O/GScrj2!*3SOt<(n?mad,SYUf`dN4/OPZ: - 9%$BLhTKLPLYCZAG(T>E!0Q-YZ62TB;Tc9GHhNsMT0bH-PCC]$9Yj3rf*+Z1nSZ&SH!O)VS - fg)CGTme3D5\>9?RX:kE;;jTP;lN=NHST/0^L#L:0('>*Y[>k5nA9O(ecDHNrh9:$@VYgjD - OA;[mPX$q=)i_Mk=7DTIL*Lf9TDMIn!P>e[-r$.BiOg,I]MB)3bcYj - l"e-[7Rs4UOPs(W62nfeiS$YR*@K@itV - Kc(eN0W.^/Xasa3ME2g-*[@WX2d: - l!@ZJ1b6q-Jl5KRh+iI8WQLW#gp'i2*N\6#%[/g9MjA=RYsFY&!NrMt%u`k6705V5M7:bSn - tZV?g]oG*)!,?sh:(DFn\4NoW-XkTkT[H>kqk)@/]%c']mT0p13J`oEo%Z?)2[rNn>-T@X= - '_=g!pa!*s/"ls!?NrF=fm+t7(;TA5#UW,MsUf`=aXQnBE-Fd,lm`U;8IL$eAb6;&L=lD2'o1Q"^YB$@[NmIl4[g6tKTI^r0Gf^Ip]8ilh - W/oqa1%TI:/\e@>/!hLST?.e]D6e2F.Up+T/XR$g^IF*r&H3u_/U('V)cBNn\R.T_KYdp=r - fQU+l46u_fLlE3"nP[,K*!&`.5>8d<3D=,K4t3K[\P,'A]NZnV*:bj$%(;*-8#Y2r8dqd;N - C5-I(&#(ncgW2U-''.uLHF][]S9[V@LH`1ki80I-e!!NV7'9%OUU/5)$&bCt8!n5reOSB92 - 7I0D0ipH3Gn0QSaVIV0RG"^mTK`h8Nk66olW/?VfIb\+uYba@iK9n!H+r^c/[!0LE@Fgb2W(f\=jktBDSBd:4Zeh4GAmH(Oe.&RVQ).dduoRE\,A\_#\e&GUS8hHF-aJShAUCF6sjWQP9dJ^pihj]T>X")W+0te6?X7oBoJPsu@[XG4XTBHG1YcD)-"IeGP0UlD2F8Wf-H(lRi63rD/SN(b%]#%Ij#L?-r:c*MNKM`5RZK+F+pGet=o.Tcfhc - _Be*lPGcuJp'lt]7T"6N]H`ZdB%W]F&FO)V\I&qCT'rbA75^<89*#8$c?KQ7SVC9jX0&Zmm - U,seYbQ:ERlK8AoC_V=h&@pPBP=giIFAup0;[O,1Oh6% - Js.6o`,JMRQW)dG:_rGjP[)kD(V2c5ob=,.OIo/&9]k,]fITh0W!W?@'*hmV1&J4OZ_;YOL - b2@kIL3*$iJ2!mkO9g`cBE"6?M^+K]O+D*M6A#hr=(!5I3a?LC71WX8M\Q)gU[qE-UijAO9f#O")0#GPRuW.1U0Z"YLM(RKEcJK57Wd*T8sB!.b4aT5%_,cNh&Q - )1I+A#sLY2UA`X1aDqa.,sf\(JedZ@lp\9KMpXn448TN5>):tBk.Vo"op6K'&G%Keh^(5Y: - J?'^T]gEdr*:3WtnA`VEH$7o=Xf^cu^\*K&X-tP=g+/bu7`r2@Yj`gG]SiXbJe,98c93/IB - n_=,q9/i"Ng:*T@X%0_aX$Ycce)_53KiBDO8]:ViYG\e*&B6aot(q(jnfD+eNs.4dd417^82nJr9g%3X4fXKi$Or$ZIdl`]+*e<$ - :gm%*=isAKGMpEj - YL\dGg/9M:XZ`Vj1(HWA>dnPZBTSB8]EOVS.L@O5r6$PJ5A0WgD.O9R'S;QJ$?8ll78_c7p - fcQJ!FdU6RE:c(%,r7(F=tLK8Zla7-/&51/Ikau(o%pXN.h\:'W.-^fUb:_0r-YFeVCCG=q - 2!t&2mqi"JF56hH4>@MC(KS,#QH>T1HAB+r[:$fA?Ws*D['.6n;7oB\eoYlks_J1_3.,bN" - ]YNT9$%W;+q]g5GnK25QN[ObCO)Z9N3S/pp2m[,M]h;aRl?6S;nIpE$mG>fV(C=>5/3A1Rq - ;XH5s)ZbRq,fWVR^ilP6=SL0L/;[Un`#2-FMZ\1c>@Il[JV1[_8&[XqZ[lKfO_c&(&fO03sknR^Qm)%BqW$TmY0X=9Ve'!@<[7IUNXFLKBq$AljA(4a[Q>EAf2`(oJ*X]NL - /4Ft^iPZ5"gAIpKmF2j,:k$0/S3!jV4ua:f_YV"p=ucQpi*,uun0'1XpW_`;@GoTV0-_)Qr - a7\$fUVC3nC5fbMD*tjnN-Mc`S0Vju*m=[UJ[`Op.G&K/n"CAOj#i')LFJ00#KcA7oe`^t` - Dsdgd;?GKTMh,oD"+eIO3]Q1%,p1Ks9E[:.Z)(4e"-5F^9kh:$Vf^Y%W/S"24.Q2IFYP_L[ - (L^rM/uB;j0#9i^bjN\B:g#F[^YE>d&?]Aaq+(G&t9*=*UB"5+C[0Un$GH>%@AbkF!tU^X[ - h2g5:J5If=OX=3i_uC9GSbm3Wd_,ZF - V'2iZ,\9cgr,+fGk14E%8l6WB4C]!1C79Jf?4k5p\D.?t9HIIA@R#YT;J1(&.uLLc]fDiDKGSr - _@Cu@NmY7pZ?e$e=<>+i@.c\)E&B<;SdrshZ`%fE>`sP7/&^=+#?$gQh)82c$@&akC!#ro; - sSdhcND\-K[AkF+XAk]d*VAG!_TiP%IDM^S*^KuZqRY`)G,d"F/= - *+]Y6M^XRG]A:GU)*d+B_h@MK_ukl&9+6Sk$MD=eMC2`Btg7Kl!QWF%mR)BoO\+_d[^*'h$ - F1.J4sNt.D"a\iG($,?%(\@O3o&Xtod!l-Vp^dJ8X3>@XurgcFK^k3.T8;&!ER#OD^KOK]p - Jt/gnf`iDf(f9+hBgnT6o+3TnT/cibZ\*rE%'NEqb+S]Xfi)lbs"CRrQ=% - l*CBl!=o&USUUkKV@E/,/#Q&6lZ$/Sg)1a;!/SPhEnGgX((^_l5QOD'7m5H'p@cEe(?%J`G - f=k!s=.h+Lc2Yd:f0nHn9<7mf#!PZ*=j[NE\O]:=,dP^1a2EAGe:#BLF - TXXd7WGpRgh"0'8L?7Q4bFqAP9Ur; - $LK0L^A2M9G.i3Nmt]Hmd=HL;]'J\MRS58o0,$+h.nKuo_(5?`jEftfmtZbM@8Zp7 - ``@Z;@H;5ia#J>;kE!!7]+WjgA%Jhm1toR9EnY0-C?b3O`l._0me/l/)P0!\7n6O6`:DeIV(,?US_\4NJ1dtV``Fs_B3/`eG - 8"E!Z%oK6iiiE=]cG^Cn`U$rc>[YPbKfWA](U9m'8O=q<3eYUNb/,'JAD*s)6\9SFU[eU5d - 4V*W'+h]!K)8/l_8IT;9:L#()VG_@KX;#D4i?P&\JcD==rf226;Ct:6od=s8g:CM7RV@[WE - S^_d*@l#h2bG"_)i;P#\sXGp6:t:a'n>&@.Zb3IR3&:Lri&qbdE5-+:'/Q$`apY61`&FiY' - BrUWW2<&Ik&9*LZ_@V=D&Y/7Z3#AV4,(*^Dm(&\kD]@iWm#^jPI(KQ'%/%CPonMP9%:7Ae>OnId3,N,c@ - u(le)aDn9XR-e[_TI[5g#Op]FIT1]/?jocP5o/%2XeVQ7='G:JdDnjS">-HPo-;'(7IL[Ld9`-Rk[X1Un^BLOuK5TLh5 - j&1CUh7E0GN!aU'&?mlm,0`oH8)Hua8,8!l8k;`t76i3$7'^CG7;&e$OXfUqY=sQ+a7]kAk - 2)GoQd"EWI:RRBJfYTHtW-hCC@u9!RbLF62g7X57Mk`Sf*C07"F[4)1Monu - pLs,\00kh8S08a;$8E!CdW%*rXFA&OVNHcp4D82/6EaSQ3(] - >!W"tSFfD!g*p..HJ$;b%n2K1m5#(I=H3sP,(W6/R?sr0PRT40h`uITPA.Uac]/:eX(3Ie\ - V\"(*4o;e&o'_)MArHC+su4XhuY.&b&&)=A=mS*9H[W+j]YaNd^]B36hEW=S3bdZiL!Vu:> - ;,fA4F+o8(`P(+mE@2@3:(j'!]Sh-5HR]mJDI3(9dVBJfYPV65uF]bTbt(%^AYRZ'J>MUR0 - f5;+,HPhO[;s- - uH+\,Dnr`?".,c*?m[JQMGFH5Qb4b-4;hq4c,?C@jG9e3(T!b - j.qRmZen[+>N=c'ga+UF"YaHpk%#dWi\j2V/N-k"7_[+^kiT++VFa@n8j=gh5<\4DhG)-36 - ,.irb"bc=:/P;/;Oj69(AJI,dsWSn]'5Nqlit8l(6p/Y8CA\i@Wl#`#UD.I@Nc9pl)DT4XULlfp8bj-&o#9SMT2],NbG, - 5YaqRDX2I,#b&0E7LlRN"k)]Z0,EpetU*;mbh$fTEqX:lin&G:of)>("rpRB9+>t)]-5@m0 - @M\<_RO0oW'tNTV2rfjR>LoV)juclI4YjC*C6c[lmQo;JO'HS)C?7BjDY.oqoSO94;m&]u^ - 9cV_c"gja8hRVQ/^q(+VDMf\5LcX=,cRKs,4E)Qf.rkI-RGW:`<&fSCA - oDs/q3/FkseHqsAFcNcb"G3&'q*8R$E@?`[c'\=*m%b^0rh:`_i1aEV - &d;JrA;(E#E)oU,s`U]?aDa*i4B(lX>-%R4fa7L^tlD+$M>4o@/ouC>1f3S(4>9M#U34u>" - \Y#k4@QeMYl2"r317-,d:.0_/@1-rB_lWsNsp]l?E(P27cGS',%+sNNIG:7AgEo - J`%m$tQ8="REj0)0Ce*CO_._=uo@*4O?_TLum`AC2`7(*L03)mUHV9$C^uDY'hG'Z<)(jp% - ""#OU&lcB`]_Vi-E+6J,=di8o_ST:Q\17M1Xu1!3p;"eLktTe)>M&fG=rWa@i@i#n-\*mPh - jY41ELN*9g:qBk7q:nlrP52arL(.h.0EU3L7[ek9XqhM]YQb!!k[lNY`,t\DDZa^e(UFEh* - b+Ai#SLEN@.H?[Cl;g!f`/S9_/o$:r5#ssmk,`)YO/JT>E=PHLn$)01F55;.jM&k$Vfpl<) - !(D#h*?p)<`.[fM3dRK)fpR!'l#=IU&X\Y - J>*dN3ZS9af;/^L+up3qLib)^Ll.cRbsMYoHL#;AGk+ - @chK_u[,.$t-7Y<6-/e8pmC,/EP):o2dl'gH>A[4`jBB,)8l04;5+h?"F^,'\EN]5b4PYD* - nYkpI:/%97:5T34M_D,I`X'j?>S"mUb.Dcfe>@D+-*YIW_g`4?eK5*.h*[I5R!_BeME4PDf_r: - 6VcRj;qom*4&lX0TiJJ=#if!B>G-W5=^@M^m8IBE%XU0CfSb#!riKUmo!=%N.(] - 5a%t0(Eg5mn4DGc+M'5aO4!,lf&6"#=bMUs9.F-%24NEhH%BWH@.+qsA\87F:-HdPf4I*.$Aj81HqdVlISg9W>ld9Q)0C0&N_Q`B" - (<3WGM^HTPm)q;tZcBC;IC)MF87kl(6W>EjJLb"@2F)XrgAl*.FnKd$P7h^]#36,k)j - W=t@rK$9$dWZekM@>C1]BW(XL?lHHe[K3RZ]oQ - aXWUd=jI.nMXjkZL+mB0W;$fK(aUQJQr+H;sg4C\,RpM&g+REI-q(&k6/G)[\1[)`TG(reT - 6";HO8QU7raP'1;_T0)d`,iEIf;P1 - pF.me3K[^8]5'q3'*:+#sKa@#bi#BOA^sGY_Va$-9&pm=Gn>7/Hr)](?47WS(h[g-1$dA;Z - I:Al%B-#(^QLZ(h/"N&jd+JaTpiS.GgNk1IJ7h1KJD==kc(a%/lj+1Lb1FWOF9m/Z,$._UM - bYf#FP?pc4%F7aUm&UIi`(r%;Jgolj5a=sMfUI%e[qI[YWO2k+)gQN_73PVk"r+ - :6V)2-(Pa=oe)U-uLoOQ#-T6pCj.:?&M7'ob9TYD\gN@D@N(JZF.V=@]4_+%t22&J&%,pXo - ;f-?;`BY:AjPc%`%WVd5'\#fed9&=hNe@C_9#4XWQk'6h,R]11@ZhA&+u!%S'Nml$Aj - M$gZqC9CVF/k$M@:PIk[RIVp(Ki:sAFYYD`cbA_,?ld[beRp_->$m - aq4TWWPgd[Z%;4k_ZhAatC[)l'CTX5Vib]LNbP0(_e7jBUBas*/^<'![]0lEi_3HM.P*$_G?O,g9=F - YbHl*Tp[kCA"pF;mpEO`3c*@Fl@9%OiRg?bmQlgCBqkhm*EK(rWLln^/M?)`3un;#6"*0_R - f_5&LsqjZgO=N'gMp`PC^St5GuiT>I__a%Do]F=jEO0@9'W60*q![V,!!gBEnQOo!VU6KjH - :r2\5.9.4qSI$S9`L#"@Vi`:V;Q%XOj)Kl/nh'De;.!#i!r.MZ*jKNbYcQpV4;2NK:ug.>E4-s^0/M!a^D - 5aj:b17Z8>^rS.BXV)poNPB#D;7"Z[n'-J39MFFXp^I.Ep:cA]9$kLjMABeL?CIoNHAbt7W - hd4,u!,XX#>U9]<'O9%hmi[>p-B+=-uG5J:Y2Nn/[3:%#G;26%(YLI!5\RF)KU,0DC#!'lJ - >RLe8(CK&mIf!7;&q!*-f/!%Hhs6QcK2*Ki'DrbuZ[8.C"g[SX)s?Ph/c2,&8]S;qM^^ksaM;dZhA_"e]ND@g1"hED+V!T0ISmX7LB2XhO\3,@r6 - Y1AcOqFaaoC:i>ne,"hsl4GC$f30C9s51c - 1In_X;QU8p^ - ekWSnnr5f2ddAfHdEF&5@IM!]`D2r#Ib/C[SpsgkpQIdkXirg'O>:4i=ST;M*GNk38l4Kl$ - K0E]L>#S/K%-B8iH9k'YbFZ`7dbC,4XN\R:7I2>T"o#h*5+9oX6-#0GP9ZKl>mZ'RWp-+gd - kR\tcugAcrur\;`BNa]j(f!s<2=6VmS0Dq`,MGp>WT15>i0CBf5jT.%M!G?^7K^`TUf"7r\ - B&h`OiL9o1oQm3;;*lB9KZ^"6D?\rg"Cs,Oi'RY:;"Q0MIY7JXk6;Uh@*-^:)pi7o&(9HR5 - ,4rfismnsN(j0s,3.dFj=4118m:;L)Q!Pg#RGnD`NC'iTM/*c'Ldt.5mDeaO:9>UW5f6l%X - 8KB$OeR9&rqJY0[+0?56f!9CBNG.$\WU*+V$3f%WLYBYjDqinII>H%h6ZD$m>-!Ac`PI77F - opkMQ^oEs;Y0%riI!YoOGH+US733b1EhY*00L0^aK1@d`[Q.b)]1N++?hXpj#p^c79DaGe3 - eNDC,U9),U9*3]W`1^:0'0l1e\b6+X$aT/.RVLD)]ZPT:1J7eJ"Fc - #U=2G5BOhQ`H:[B0Nl"mWg$=RQsW-C@7ph$aJD+[rF;8lWd - 0>mW,Z$$++1AFNrdM!Us0,=Vg,"[isilN=EA&B0UB%Y3;"?r@.")00V0EjR?mn/J\K&k0+] - Xgp1X+Yki"134m"ZRms(0f$lL&FI1;!)595b\418?7kY-o.r5p;)L.02/^DIct&lOn7ON1P - ArGnMU'G)bjTJ'Mba2Pmf=-&jV7(?'h[nt0+uS!(sbhRNl+-H.V`U.71i.]$HdHl/=$fC^8 - FCPa!"WAJ[[`1*'"QQG7Z&Y@U0m>Y\[18p]e1AZob\BTFDNI^n?Kch!2FKLXI&dk%Faq##$5:Ctr7]*[a+H>NS20;D - XZq@='pH"#V="JSmb)D8J7KdDG"VbX`7G\BLh$VY+7s'#HX3DrA-=LKX3bkOhB5F%#k%ZXk - )DmhYnu&D3:QRD4LHuQ)n3-0j.qf#8W!N]$5:e9Q#P9uJP0F8qd - 0UAL9r?EU$o21DY..C7LP6j]:c0JQ+=+dBkXj9:B1W;Y]Z-^,9ObSJZ>(9+!*IA@;cP8E[4 - P;L0iKqe;ft*![5T@K$M,WG!>S-+ - 3G1>b>"1$BQX$_#L?"9Ql.72O`8K:[seQ(6K-EtLnoGYpF9MU.G[JaIoZDQrA-crPX;=_6! - HId*4fMVY#Ooi2d./YnQfh8:ANLN:6gKpdiCJ4.^-!MiJ^K*6]A9LHSllejb$?;4u]gh;Z. - )Z.0?o?GI"VD)JZu9K@EG%1O,>6D?V"l2dE2H+3CCukIXD7gra\h8HE$lcZG+E@2(H[SG3! - ad`CP=k/[\g"c:Bk`2MDn5s/As'6SLX'n&:N]3$Jp'[]a[ - Yu]//m&t6pYHJkjQ(2VX[+_DW-eA?%p9>t8*'BOl!9U/r-?<_a\ou*$)=u`je'nH=a9a:K@ - lJCUU8;/Ek8Xe$??+(mCV".*WrBC;4I>kn\,C7YHp.251_pMOO06"b*;`Bo@>T`kVUF,j,e - A"*@aYh"2r&2HCiklO$m>u8!,I5]@tZg1KQLl1pe2TQ@ - WNaS_03+"of2k`72X^(:.bA!lJN'[`=EB/bF,9>7N>:'3()NNW\I_$8b`[1sZhMtuZ*0Ae: - aT9&)q4&#FaoZ%m'oil@2KM@WF94R\RD\TJas$C<[sN'0pMKA@OH"0o33Wde7cAnR9ZN:'HP?!nOqW'[#"=]!M)]X;GnlMXpR>%A<5F#q - NeC3^X3XMPaGEu2E@5"q=3HKb[*rGXU+I4I.H%B7)5Zg%)!r7kHfoe6rl_cddVg<*Fb3GeT&Juc) - C7eXFlVAlX)Rg0o/3L/3I]:upB=:H?tDm@^gV%b;_GU5]m0>!^p4hESXRm"7Xn\7/4[(B,4 - Hfibg=_p-]S'o?lib>iEgFYI_^s#T`0Z/p75JLGL_Kri(-+AuJLV\Vp\CGj`3F9s6fiVDkP - 1g_T=-HcgR5n,S3J$qB6?0URdsZNq`R5L5q-.015K8;W][?D')q0@Bfjc[>LjNUUn""2d7B3SZW=g',MD\?3[2Hc43[i%`XR:]\6T!<"< - 1-,W4:l:IH3\s8i5@U[7o8]G"te'E*TfB($la4,]ZYtns5_t2FW?p?S:i2KZnlWgpJU4LpEA4j4hl;2^2S,o?RZUId?[F(bM1i=]3RjWh>H(l9tWVdU]*G(DMWjV*6A=+Fad - KTVcO$/N-+QdB6eZ9\07]<.mlD[jJ&SrcA7sa8II=9hYrAq^5_@UOm,&pl"/jDDL<>-<' - 9VHp7gR-g^Bqjk4VIW9F="puI^82UiU/nkmXFEg^?hGn - b>:]#)1K4JrW0PJda_sXrk6/cE2K5'S:r9K]gU0'E_6NJKRUlT:f;3L/&G('0UeRtj)rhVr - qb+C6XDS9d2tOuG-K*FT-PQ*1VY%)^KpC"$>qH\hGfj\-F)/>,KRADaSn?pU2FaC%\6"TgP - anUhi7F2Onh5,q1"h.WXM(3358($pW98s[*riYa6O_MlWMJM):A;:QC@:R;hV0#tr:&/:(7,r!Hh16r'Fi@Tu2jq*kQc':.e:!qFRI-e=*/'l@[&q(1T73g4( - eeKZRqgbUEsc5-'7XAb-e,]72ho?Dd?"N=fAd8(22F"EJ[eiN - 5[ef"2^+c1A?f?B8^SS3Wf+K!Dp@Hdq@JGV:"RqWYr`=7dX/Kkms" - [N*uC![jn!cr*hQN;g$SN\rZ8HHc"6QXIG6uTT1A_Us$,uS&njOA$jnu0iY3"36"'='-Gea - /,+FjPj=:5InA>=-Qn[Mt8?rOMAB#ln,l; - (RoB=;-&6<4*B,B-PD]'WsdrK34DGkAqULf^uL@d+[KM#)@o-nCa)'[EP;mA1JljfPf*kZ - 7ZbR968oY>Gt(^a\nC[[I]I,BYF0!JVJDZ5q8RKHB6iWdT4e!)K:ut)->/]Wfk+6\<7:%kO - !G#E8+;HYg-#BmG&_hJItY>?L5Q9n=l#lV(?HUEig&Y!6u;&;'&cV69oX7f1XRk6e> - 4.F_,JpA+fTqASS\I4gT"[Xs2nFnIB1hha7-N?'o<>-]@#0r^W16GoAgjV"akDU9S,D>DnVe01+9hJWN2*6&7N,+X1gD@f&fG08u*h(.=!Mq^"[!Ai7VRnK)2iHW"e0qZY - Kde:EcnC81dOX-NnO+Mc0_L3QkBo<^&;KTf5A\I#\&<%]HDpDD%XECo`$hFG+Z*t(f164!A - /@2Ph>8o[Wd:m.cJjJeH*C)EtlAuj^W2DQmg6T'.(n&hTeR#.nX[E0X?-NKd`J8kn - =PpR0IjiR&2^fNoF9( - +TccinPAj_KJMb'd*rF-PZu75IC'gr%=#@4reArMGNjJI\]2!*$JMW0D1p<-gJ,U1-&%'fH - $#af=_;jOeYaIGIWO@gaaQ>H=$4Y:<]!oqN`DN6G - YnQnns!YMD`K$\`9+_3XDAl*KYY,%sd(]+0!K7X*=&]nQTR-@Hm]t;Er[aH%%e#u>\5U9t,=ID - 2l`LQT""<3l=!"`FXC;\8GRCDd+;/EIASII1FH*G]+>WTCqci5D]Oe-qug/Ns/(e1p44SOt - oo/eCq#_AP'$6j?PVO:"%0i$=_9X^knkGRHS/tQ$#*pZLqDXbR/kRF"]%[a_BXK0nsVkR2ot^B - G/;Ar``Fe"`YVQY'+l1`Y1*6uB-5T-M=D^_Gp]9uK=&fL*D`m%'KLG - (.imHWP"MS[Z(Oro)XZQZMScf=Q6Un_=fQL$soI".Y`,f/X0sZ>tl&&7,)t01?(p:\0BeHM - ,)42(dapP*pS&mD?)6K6"UgfQiA)`:4RBMY]PrGm7O0BR&Wk$gk)_::UEobA7cMQp5eeEUJ - 8,]D%okhg>BSg&8.4pju`12X)^m"k=Dme:=Rk+$j!?,\"aaVQrt.br]]12#8IJV9`J;YToq - /ql6(af[][Js&SJ$0J#kQJ)T&f87j]0=`(.anc"$iqu<;_s$-D]5R[ZY*!/AV"$esO5YM>H - >QKgJp[bh>UDdR-UN2/6B!?[S,GZE0> - b7[SJXU,TnPPU:(CJP1Lq@;US9rY(r"02_\e"iqRXh+t7mq_q7#X]*S4Z2N916Ed7*J.2#Sk;A+2mq(719H - S6&Qk%+RCU!q - 1SNI7u;Z->&$MM/Ait%^;B0Lgj;Cu*5d*ka0@3VnOp^g[h]NCQs_L:=<^:M8Bd&agl=qlO%B218IU_Q*0NlEP=[m$8PG0F*0q<6(eK!iK&i=%S=0RcRft(-3?[ - "0Zrst6%kIOsX:uMm&opFIat49Z7T?*0*#?Ns(VKC6b$&c(1D.!0'1'QJP.T8QCNl7iRflu - b".Y'sclbt0'MCCj92(UD>dd:A[nD+Y98pDSS;^*3#6?*_!Sk?iN4q[+1VL-h2PQoM8ruQE - W=[:$27"/Q[!mjGXs8!o^B?J[)S4-Q$qMMHa=sL47"n0BLC@.D05clL - RBM%"836^58Re9Em!Me`7]WC-c<>2.WjZMRY;)K,abih@"ks`h]9%&L;i_<&;RnhamcKt#G - %1:N8,>pZM8Mp(_be;3d4\pl,c^_itr52C!kKh@.a5$[3N;pX%!6>U"%ZLP:4TpCs"jH`X9 - aoFt9f>pe2c;L@MgUla&*B%9&f,9q;as>h_ukSl=__;tO/ - 6";&P;CfTa@<&><=X`,H>7RdbPe/`S'D+R@+MnH_CLYV2"FR0/Fm8WHqeGSf9%;&]/IolQ, - eNEP$FSJjHq,MP5;Pa1k=Na^?I6'IX:\;[Eo!Zc$2S+"Q2C4(d!m6O+XsCr!OGQ&O81N:@+ - PA^i=\&s(>gV/@QW\a(=cJhPHpIb*#[+Y@fuO9Kgt%EqSU`knJ63'1*(&>LUKTgV>"ths?) - CeBQc(JLJ:4)@26%'qf%Kg&>0WOeKpp_XeSPd>^ZNg(;kPA3Dep<3[sDj./1S9NtIJ=WI03AG'.)b?8f - BR"W'O:!N_jcV55X>n,'Z8-[lu#i.HIh+c)K?.N:uf3)t?J?@:NNRE>j"C8^fJ0`Otn,e,? - hb151%Lq%Do^t\X*!0^4!sRd#e)CL-B*AB][VU7l?,@!2LJQ\^`[+mB`Eg]ilAO'iQhtBW9 - HZK`k*,Qt?VI_V,d#=*sAn!b7OINFE6a@BH15Z>di9i%$Gtq[ - "'k4Z_im"FH*SQD9]@h#\p*\$,%1LiU*?ZCi%Xu6;E2\c4lJ7-B#hCO3D:4Z^2(>^n+ - jsU)BgKGgut*^VkB$R!9.6P^`$%I;5CIU:Q]T+ZG%["$`R7>o:u/=@Hf$rf5B9FfuV) - [#j<4?R1-;e8-lAPQ6:<)Lt\*G'Wk?*0dX#SCB",eopNjj%.ChHjd]?Y04EAN=<(+c9b8)Z - ]kJ>ofkp2J->F*lSC7?V!%d%VfQO5%_HNTPShh"F,X,Rt_f6-As'12AQO+036lbe.*O1\`i - "RUuE/5*f_6t,T'8\Gb4mVe>9i>Od@0c.C*HFk5K85@KW>JAcrlakY>&C-oqqpD:=nk$t/" - U-8E[]3TsM&B[2TNhGTQ)/ElnbA%gOGEEIf^P8!1TB]a&C31PYCfaZ\N&PU$_fj6jh%qiDU - A8F(rAk3/[a5i_eJUA`"fJfNOX6VsVCJM9Q?FFWe[iu+b]qIK>A`No(P_!F+h2XAoXce:8CkSt,COX*7Z: - _Y`RlS>T,%DrK"!SiaI-3,'iH7Cdm,.(Wp1JM9CpEHlSO[+SboQe2dCt%?8X:Y6WjYKKZ=5 - -mgf,5C>bmCrm>e/V+Aq2056Dr]hoHDSBo-3%5/"C$D3j-u*o_&iW.aU"B"1#:0HP+L3o/^ - ,mYqE[ENou0j(oBQ,h%"/HY1CPW.sgkW,&&?^<_VDSPn!B_]A-Z(%0`*nqa!+(7G^fS]%!pBL - #Z?s0*'f4")ec9F(baW$h6Fe1Eso1j!$MQWpcU+V%LD*QH1k6oAPD7>TWX0rh_C1KE!MfW=hpC2ZYldEsY(#Ef+nH1NP - c;F&)^.*-]"<=*9p`E]nWr:L"/s]#?u@mC4&-*7jGgfh2/a1*Sfg96\HHO+PY-JQ;_^2CE;@9&"4up - $%``4^2$J/nBp^C(9TG*Ue1!NHCA-FJ\\Q^!u\q[.N"Vo]peppt#*Ie+Fe\Rl=9/O)kS6?_RL-j7cu5T46JLA')2jWX!+8De> - :OBD.C#it#nk#Aaa^LmZe3?Hc\n>q`dMQ^BFJ"]'8_Yda8?[Iht=FQ,FTnRltIZLnuDGK^;@$H(T%j"Nbj.!IO?AH-`&U?jcXI3qn/>GE?J3TK%/"# - ku-boeAc*8$MaeF`kI;'&TbW+4-eOXkWlYf1()b08V0B7EVaMop;utY@%fh@1KRG'8rB7B1O)4SH7MLSr]<5JUfZ_/r^L=Kc^_B6%p7jc`3R$_L&hB?,CTaaC#0I)% - +WcrYVXXShe7GRpg'\Li4M(4Ta0G^%^jR#6P`-99=7#-$K` - >6XT?XKLR7$MFD"%Gf42O)id@X&bX(r'-f'M78e(]UhqV;b>PY>,fT"(Nm21bH,Sif4.]5\ - e+s4PKg06J<&AZU,_\kt;a](*D++8"<`N@hH6$V*>HV%?0+.jd`0%>BCr7bg$IgZ9(N%7JK - (A!h\lZ&dHc>.?HbNir%@dKt"F7isYedD+!jiB;`Z$*jJ]"]S2>hnn-^DlejI1s4L,eLX,)* - V\JC,aPKKQ7rc&W)c`T-N7I*iC\pXQZ)HUZfifZ3*g8:>`!%POIIqu2(\`iK1('Vi#@,='P - Y/.B?id#pLWcLFa#)\;Qi$GslHis_;Ofd.,eE;4&WTO8ZF(*MVr&k/L*g)>*#mQs*Z,UL;s - 7&6R":),&t10,>?UFKSBVC!L!H:@BeOX.\6.A3H#.S/QqLe;>+Vh<-JR]2@JWE?3jP#T6f\ - >p3ni4&+>G20OnX(L#.1OS.@Y=nu&_%eT_$mdtD:b(`k9S#at:/%E8Bl#>ET='4TY'Xh/W0\#oOZqnFuD;,l(:Z^h+X:8AHf6&t"L#uu,]EE#(S>2] - +4cZi^i^2#Oi86!b9F(Es&$ik%X:a#--#gbsR%)J$EnQNR`?+EqP-]Brl6_or10uPIQ#_O9 - +;Ab0nWVg6D`j*0t*QPG_K-A=FIJJ?)Z=KLS8lDIe/5&n%]mjH]`5]'`X#e\:XfHd-\ZWGK - 0oWE%V!U8ulq8,6Z0[ArN@-P7%n+feD')IL8-MF_V#7-G31[T_8D8ddp(mNfr=)nUaaX-]lP+8gi@K=M,YqWbY(pN@YE.'`-7.0<'d - i_GfLcVI<"R]QALit7&fr53kV&d.7KFi^k1NRO)):QH8NtLiuG_D5d;p7;)+RHcD](D^:9h - "MV?FZuHW]l?7Obl#j4l9u)c(,"b]rn!Wh7ns - 403&Hti"f?j.J;+-<)0;Aa*UU&A\I>t9'N$.RSeA%X_6*"e[78H;f4HO2sB(mK6_ - rFRJos:r>jf!H%8c[!_:sm<63#J8hpj-_"J?aC8#gC1[YZ3[lYk.m9Qg3;M'[go0M=tSTSn - Rf21+*6fE]pL/OT]8sjHufC]r(oP.LUa_+,CSU@ZkNMFp7Se>&!fW`ntQGk;9pL;+&XRt=^ - bsp#Sf$05\bAs7.8\3_&F*E*DL,qQLlQ-k\"(-5#Y17+h"'@C8@5bopebCd%>i_$1E-g;>3 - n%9k1TH-aISeWF7pTefGbT?Ki2`=F7U?OUB=8T>dn:9EBg%E$1BQpl>9`cMS(ih*?BUZUiS3*q`m_RR]7m6:q8$Po.7;8-gnYGT - dQ>126aNKWCL%Vfq%fG%,Nf9ksoRH2`4YN`AOX>M]JW^WN88'.j+I5tOGW&'#$3,\LoYSJn - CCF80O$^!AL7uho(p`C&b]>7P`2r+:]K6F\1T\()Y<*S'gZ>&=^,Dh^T,l*l#plkS?^eIES(HY=hl4_I.R\EYF/l-5b+kco?<3YCApWR`84@S(&"hKHJEjYhRHnG(_c/7uk3 - D-"/%0K%3R_+SD!ro07G#kT"qV=4Q*SDqbtnGiBNUb8[KSkF)V\V1m(JMmoJPa-)![N*ICB - 7NcH7&PSNn2GgS<,'GMV"Q;seS,\OZAR4Si*P:&9]+W\ihZPp[qYbb7u+Pu?JnPB)WM'Zs, - *Zc`Y_5&h09`5^CDhO;Vgef"@'E/eD$(B]<.4_\nTc,cTIlK."$mtbc2+_HGU:J0tJF`Z+` - jj,#[O5>$)a6,T(4T&(K*M=DS-UlA_,GZoB:"%U246LuuS%O`mAEf.5l7S!bo\o\n8*8&7> - m+$CC3.f)7d^cb/5pZI[F@7JXPXiNdaVLphQQAKe//FBp=FHAl5,6D6Nl"qp!?hDJb"MuBF\rsV_CdMl4X=t=U!)mgJDuBDn - <<4^pM5'[1,1)9V.ej>fq#V#Ao^uY^6Ik3#PQ4'L*:'kmj%oCtH%HRml>kcU4fhW - eC-6/XNG5tB!o!#WEO:IrkhZ64Z!KD?7Y#so\phS*o/'tm?:OX)$2D&35:)hBpe^tTh?dOChN*0A_XA - %:A!Ri%9HkHS",YQEj'.0,L3CXE.R;$>J]3opl9f<7O&Z03h1(sald&b5p'/p8;A&foC9*: - b!f&fsf!B-K`A>bH9b^aC?,0-``1,Cn)b_&jp'D^8(-)aV@e`*sbX;BF7ekAguWct$47N3Z - 68lEUdD`E)/B973K]#dOYWD0EPbs,Ck.Md[qcc+!a-j,a(h@1/T> - q=Q`S"-IJ.:9TogBQPp81$OoH2:(8_-DX3Gu*jU#1dbYr6i^,q>/qFTe^qhZ(EA'R#08$K$ - 5h.Ol`^O=F0S.1s_:(+@M\cu\_NEd#9jm#pdUlACf$6t@/f=\n5e5301.$a=9o>6r`A==Jh - N31,F&#BT4;[Tj/qICi,bPJX@KmKY07Y0;L!C$hEp.%d,!fg7KU<_-Ji58h0p>('EE_,e@5 - LoA9G:&$P>3->;W1PT(\:g8A=s8cZSl3"2R@9h+K%=8FsZ*Y4G:dPZ[s.FL@s#R3J&>'bqT - QBqU:H'e'%aKD+)0\g.gu!(kc*IJ[YO9Ql"6V(%_hFe.2uGgeoGK!ONb@J87IOX[5e,'(d\ - 5V8F!fiZ%H6)"$WDYjQQ$o"iU/1%%0JPOr4g.-.J^jRY);bWsHg.7FSGjp#Ya9^sqJp@U7S - 6LF"b105k8`Yh[/(6@Ggdd.PVjpg7P8WoMF[%7;_U&ic@"SA]kA8`9;;G#<75U"0@d>6YCf - gg]E3=QPT1j;W(.7_[+-W7';@5g"LbnKcP@6a$Xf(YnaD$G"3Fo - 2M\\5m3H*F5K8VuQhd/ZgDH?">V5nMW+)bNpDmK3o(B=SlJLM>H&@Yk`&3Y#OZ"(35+;R6" - FVu`(Rf&*F;D[obK9^:L>TL;/;^%7h"XXUYP[US82kP!G0hPgn!10a!J.>Gb,BX0@. - CJ)'Tj)mS]dHkund@$aETH0SIqo,fFK3j-nH-sR3GXcOCXEY^/"qAX,A`J_Ed.(3NL(EagD - H)r0`f^-27D^lDb8kZ".0um'5LkV7s^g7>n^s=(`EL@WW_DS<$dG]XlVoL2(0*>.b+iYfM@ - 2<;h\=TKpZ(ufO'@M@tn)uL6ub2fPcN^F,*kAL1H\.%hh&*Vc@,&2e5QJ5cbLkP"rocLR=Q - ffUn$1S\,'q8!60_g_Tq=9J_MDP0E3V9>$1#XDQPV4(Vbg0^]q - A#j(I'13lJ.m!-Oo&&k+h\Hl<&Cq - ?Nn/Z`@9=X.$Ysma60N$XO?\N-Q-h'BNbi*G!blJRtZ&^s3Mfi^+QsY+"[Zg@)3`o:n?b5e - ;$76!F*9$k7Og?.YBG\qr).C&rO]2g?]U(ICoMZ%GIh3^GX/`5sCEMdVZe=#QeWfoZf-kF3 - a7RCD2fB+GQaUB0sHRlRRh12XC-o]qWY>N93@`$J>lC(2,*8lgI."WODkGXQ%b7sNFQGUtn - oF"+H$$7(()"LM'RU,9BD\sob3gTS4.Zb'GN]:6FEgV:B?_n93o]UR*WgX!PPe%Ju*3^nF" - bI_*dZ=VP,F.19F - >eQ,(Ig?1La>-B6+`3[`,f0+Hb#W96//*L)lLL,;oN!C`LL/G"gM:M(i'5YLp\%]Ra[D?lp - Q"@2l-"'j13.aK?.;QaIJ10gWRDQ'ImUg2ru9`ptu:nWPZ$;Sie\Y==9\#k";-)N+,8-DFjNX+1WoHl7sX-#(T(BKTPGN66'cG$jK[2T6e#C3e=B7^h+uQA;q5/T - eX]pph-\_RA(Fpuet$U-d#82mF*Y3FH@+iU2a`oU$`WR9f%l8:h2g50PM'6.fq"Vch*KNGU - ?n3N#EuW>(SbWnd.>BtFi2\AUY5Uth4<\\9%.S-e) - =h;)ojFo2f;SR16>9piS\#Ii1:>7h@J1cUXRSL.3%6)Hf_M7dG&j=gUlZ;GH\8Q6RbGG'>& - Ds)>Y+46NB9]=Y:WONTa0 - /\s6M.G3+\6o4QjZDe""Gh'J%G$$:PS!Ml[@(*i,dZg1r,l^k`ShS8Cu_sC^Mm%2DehTtR1 - e*UJnm@N)"hR$J!-Zh5nFFAO,HPJHN+u(.rn"0FFhZ*'e"7TY&n=L(o9%["OkJHreJpW:$? - %(u81[70%>hl\8^9@%`1\4s4o:J,5WnB;B'M!T?`mVaBpN3B`lm4jc0:qeh4=F,I&]2'F\0^65J8mA0i_X$dA'HjZM1XX^,\*+m2 - 7Wjn)\2r9j[6r=M&hk7i'bhmP&lGXFZC/hQ-$^Ye7BPN^_P#6*_&3u."1$hted2gUPc@K6R - _![*$70Kp$]Ka"0$G]Z+m&W&p8O]\ts0c>s?j,r!dIR,->8E>q:1d2`l#g0uhcqM.V"TZd/ - 1@RuE)A8T5AFnLHrddA/;!=-I1cePr#sn[N\o\Jp"K;CdPu&3%B3D?;C>^SDI2o*)r?CdVd2kSL^om6S.hflioJ8G/65?#n`Q20'eK"o_ - ar]7h@,R/!KYD`tp3Y)2*M7krM;*_3KaMLD(:'?G48VY#m]8M@&@6V4GmAdlg3:`V"d;R9I-/ - #qmP/1M::'V#7=&4\JZdkGo$5N4)P2GKo6h`+@ePik)&ZaB0`:G^Mp5#8NWs$0C;'aI'%Zo - &+4d35V-'N(OZ*h4`9TH"G>ThR-Y;^*MH6drF85>Y<:'h;/$[5@,+c*Z,Z*7_<-79C`!,&G - YWl&)LD.e;V&01s\%a"klhBQH%21M'?m=Z09HAm)I(,W$*6O]cEj-?O/J>:spODAec1rPd8;HVID&g<#(OBHl42mQ?.er:\fW[fR$C=''':d'D:"$R2`i?a3p!h+lC - *ckdgIj+JU!6?&kf$]36Or=,%=l+dN - i]F$/&5c?$Ym5L=L8(Iunq]f/a:FZif-eoeZM?eBK'O(Kte[tIqLX"t;@(\b74\_ms((LuH - L^,M,6Gs5;rk'<`R/j/]rOR_9>6N=28HSu^:mK0!NR9?Bm'XbfcWHu\)Jf2<@`s7!ECWR'X - Q_Bgmhm`(PIm;QX);GBl_LM`/!=q^,g/uci*b/pg*A_^c"G@;8E(1."3%5#=ZhA\U:!,OOi - ekTX*sW@1'#HDgp]rTN-7Nc1'`r>PLjES7@3uirk\)7#YdfGt9QS+XaDf1]pP8qF+[B^sJl - q8^A*2='Q#p2ed7PcKOVTB732k",H0e%"#WM7#fiNO$S!q&a*_66Dub5qu7&&!l/A2rfEnaKm!8")O#mX4Ru[&2O!1U6?q - DQiY(@>(k!j93>V#;+!V(,%WI'Pn3]j$Fs:iT60"E]]^3?O@e*$59WOYZHj8SG'6U3*8t;S$"(Blr@.@]fYU[$NNNn[B'\VO]QjBhr - 972gm$,>/Hp"eGeQ3jCArfru%2$mZeqln3-8I9e'A5, - %X-KQie?DFDKX::(ImXp4/m@?[F`#,B'ik-]JCGcRL3,M`Y - Hj%H"@Od&%A?5?Ep2NDVacq(WQ8X46_03[J.D[:>f@BI0,/P65@!6KS[%/&[4)GW@Zi%8Wp - #SD/5"PQGMun1?]YD\;n$VltKhMHZ1SM*PWGH&RmjoM/bDk*-e:!%]"#CA-J2\%Bc_+H8UR - M*[euFk8e'FH&lmWqLD[eD;XZjs/7>WaU>sW@$CJ>aa$l5-A83W[[+T-A`jSLA5QpL8ht.C - mt_)&5nB32+=srTO4AP%SVk>cU2)"dYsFT9N9Qm97;`hkadP##jq1bF4D3@"kLZSh?Q)XfN - =@p+2(7.NZucMW&^J?c>8Z!;_d]nWj%&@I3+6X1J8K!$)prYi.?'X1LVglf=CX^QqNGtnuUeq":61KeJ#Vfju=08GWqm'K]p!qKq,`H2sa1Tpo!KR0pc,Ah - /.57k4/`CB"VAa3\sWWW<+h&NfrD8g^gtN;CeeN8ngO)>H,9*lHAb;b53M^T2*'oOd#jX.ThQ2.@p;prrC$DE'NLsVG - *S*HL-4^lV:T4$/g&euMnjnEfgWYg'0W6ELU]JPheq``;GgbNU\C%)kB@6GjQj2C3T"O1f^ - K`iQLaIWiF?cJfnY2mD%3>L%Be::)Jd692Ug;?&H(mcS$[@1-m'%,U@%i]\I_)DIeD$2#G' - p&L(@GE47s>+^'[+9gs>(F\$u)Qk@AjT]Z&:4)A^'j9Dg\Z\cUVC=DfkLYQC@Y&SOB)!C,f - Q0<$g^#bUu"T&3EU"7:Nbg#bUiOCm;*=aA=TquaoB65I&A]6(5qCm&&9,Ln'u=:-60p2?j=\=>"@,id#GU3;J7G(Y=KM9lWP](A&1N - f.*B=K4J:Y]eQlq")4.`Ec"AtmT3*WlUAqqWsXNW64e1ZnFn@op2WuIP7K/kGM6UZKa^L

/.hh_),t!\s*.TZ9'UZ*Q8^lO#+!r)\oLGm^?5(RYXJQTqaf5-_9H; - MI<7mK(+ASl@bC0XiOkh+_r!`ne)'@`DgE/A/N.PB9P-k_8F=0e#l/NCQ:e`,SX<3lrZ/KW - 4&t+!ebQEKQ;rY$'Bga!fUMV#Zo&g@KlZoR[L[@>\(BmCe)Eka4&j+!g"hYs#1N'YR"9l9F - AI1(5]ksWTY6e3LpP^9#EZoRM+U>EOEecI?-3Q.h"j&Ej@2OSMQdp8J(J]Rm!g9pTsG%ZjX - %Tg+tQQqm9<"Zt$%+)f8"e(,Vfe['Qkk_udT9R`YWE)d5QfE?^/eWJ7dU_`C^!9BlTn2iBY - [NLM0q-q6h5>"ZWBXs(?O3^PQKTZ[IN4B*4gN#Olu0YE'S9*Cn[)2cQc,8*,7L:!eR1oDF/ - Z^J>VK-\.QYXV7#>"b*^R#J28XKTfP_otNeZ%9=#&Fr3pEZ1FQL9,s(@qQU>)iA)s)F8%*T - LZoa]"i&$LH7f&XGb;!`A77M3LV88lpa2q30+c"9g%+0B_j6,8h5gn8OK4&Z_KSRQGi*dZs - (;jUH6Gh'4UOS$6cXgp4^]s< - @2>F7/kbJnZ!4G/[$o)f9"H"-7*DOS"%0Y1Qo]>WdH[jP,8I1?^P:[':QijuADnP`qJ4<-\Mo?45Y0s_2i&\.B\&9LTo:W*V[<>AB],uR - E_NAtr#.]Y>EYrX.d$74)bM:_*:8p;Ue%E!4@qj>[$ - eM&b=1'V^D21,mbE<"s\<6R9:kg6h3)_du=@!#@h'Sd=Y(i2F>lL - )+rT@sIAg'[8lOf?L^DDM`1cR"JLH^QIU+[<"4 - 9]gD.\c$`7GRMX)cV1d*"t>YPs;=ad3]eSN!@0%TBS`78f`/TF"\^ePkGgS(Y%)'Blh\&6\ - T1:1aB@geD]HNFe>aZJ)QKSfDCF!=QtoS=(gC\F@p(-S"6BTOFH(;rS+]CgVcc[oTi_AV,nYq8X/4B3K;c69;E8s?>s+@@oZc=ZN6 - ':Ns5J1ecK-7+lKED3s,p0jcU/Pm1"s+Ss9rm4LnSV'Y9SmL/3_3dj&2/mVI[F"+Q23 - 8_dUO,3H/]l@@e@c!s1>KJBHR$mM]NAd$mmjZO.d6EfEDiE0tGserj+l9F52b^;EW$Wc1[B - :,^!a>_MHpd^a-G,;5i=UoM,)i_DYsi9*0)r7;7h!Yo%/,LnpAMA[:p#28cX3pd>```Jl:)dqBOiWPe->A$uo7HMsX<.KDS(1f - NhaYtN1ieAmjOih9'^`'0p,U4tIWt_c/;HAo+]1>Vo-pm+*H`=lP2qEE?k'ht%S0qo+RYh( - L'Y,r%+!`%l8%#4+p4hdMJ(,rj+Qbt#+:gV5oRlF1Xp(^P"#%ePi*p).RiXGZM5IHnX.^@C - d2D5`(e`;kOKJ_],Wd^DH_+dHD9_1U;C5:Gp/=BVrFr5B1C?Ll1>ae8=G4,YT]Hd$ck6]O= - "7VYj&kQ5D5.r+0<#/K\40j`2IQY>(]`";juD/Y:9?K6TpFi8XmVsm?C'k[&*ZWfW`]_%Ni - @rVWfZMEWg9aP1P4cl;eHaGB-J37Q?.es*i&fZ/D7JL(8;EjWL.GgL*k$)4MR_>Eash[m*J - L;G'W=gLS;0'KUSAPoFi/^m`Uh!eEOGtMTkDSfA]P]VT+I^k)/B6o]X^(>8/W^p+O_eZ)u; - /]]g0.E_-W'dlg(Y*7fDUE*()66DRB-A6.>>(7W_]][@aodOi5ur?Z?WN;_`6o+rL>&)l0eF0C>`"Tp98piHM-io42^/I&BrJ!m0&#sF.^'+E2N_.5&P8Q+3JQ.fQX#kAX&f2fmUBrA@rMXXB1GZH - a$?TP%dnDRMTDY5>A+J8eOl]cRHDVG,9' - qu\bD7:F/Ddbp/1G+^@U0$;GIRDaM?OJ[FrT>"rX!]`4^dId1)RY-hsPGaU,Fm>c)M - d5R\P1o#@59_rKRFp0\b*t[G'_Ikf:Om8sVFNH>q_R=AlC^c]rO(ic;)io2"W@a%+%R&1W:)+7r2(8ZU^iLd8+Z0>#dI<lF^^pnX!PjdJ%0OEX9GI`IODGpB_@VYP$,Ve*/I.T'aVt\oUF:O$Vr4d0 - &W!\?lP#MF9DiNa;/8"$`X=4\3(AK&D"E6$e8uhRK1pZK&gbJM$cnJ^N?cOX9U,uSDr^Ec^ - ?)_t9$33NkkBfea>kij0u+SY]O3P4!5%/Nap'b3Opha^@-DGdMURH?4>kbP;(Onm - ),XckHom6-ti>@7.UO8AdlO<,8oK`$+Lo%[!!W10RM]br&5EPjLUX8[$pA-lOk'D(61(Zek - D1;V3u$K(AQLn]Z&)\d$RMaq,+FU"cG!;)C:@k*kRLkiA>YM=Q)JLs0.;g(o[EBr+W-ZCR# - tk`$.c.N"@0W9$@/Cc)LSb^V8nEh[H>[qU25Q+)ZT:m3i;+a]=faT6gNpZX>\Y[qjT@pNka - lXa4Sg?WAr\4`-5STp"1M6Ef*iuZGiIA3;bLj92WAUFh3Eua\XR:KNY8gmpj(bpi[7m"WSAa7X=e9%G\diTP3^FIJT - D7>!pk^S'3i^9#Yh_H_>ppONdHa87RgIMk#$%9a[a&5S*p6in/MrB_=3sJ%E%]U:DLk=S8T - Fgnf3]:`=Z@RfurS&Il/36@&usE`8dps;FPn,@2KmPP\<$nZ+qg?eUiQe2ti?d)p.gpcZS( - >n9is[gQqZ#LF&?Z3]n`u7''Z*C0nr60CD3Fe:Po0>."rM6'V - e";a71#l/>R?ZEHr/81eD$56->"\k4ll85SA'19gr*=0B0hD*3jAt/B/Gp(GQs`X!"g2!Rh - q,*,/lYS6^umgrTWiEIra23]\+X-DJ;j04U.u`$iM3j91$q;@Z#a=U_Z?_6,[#aP%SCE,LZ - o^6%nZRB38,\k752@Uk7GUEK@[dth%)MSVftYSAVFdGY(GXY@1oc9VG_>Q\BB=s"qTQ74G',l8XLZ]F?<@f)tYB1X4 - iEeq-m^$hWkPe(T4Gl30JP;c8(jpLum+)BYWXb(P?!'YUY>p*Q=4&*sd^.#%@KG4RF!<'_ - \AGLE>]3`lfji;YI>A#NN3&lc)/OQaO(/C>$2Zk5_rJmT96`C!?:O]2 - r8lVH1r?:<`,/Gqm[a'r/1`Fm&AM==LF;1V%EK*4H]E?dl'a%^C - Ott$[b?8a9A_Zm761\9k(o3haZ3?.j-82u16AXS\?9p9I"f%*3NEj)Y2JtXFN3+l?BAEE". - p["I!*O3WYjf/()4t0agl!kOQ(?>7\5'$I/87qiV;$fIJdq;#3ebUobc'f8jjkPEnijUBWl - f%6)0Cgc>eIu*YmQrFkVgf6Xm>bC<6MB'Y_]q\[5NNe>7Y1Z?&Z/X`O_1^8Y<@*LEp%ea-( - 6Wbf5db`D="OgIVHQ9sPH?-%`V#M3dJ)4j8.jL?Z]c&MW0)BR*tAn_RKrH>d*V^%]PBhcoP - uDr(B,p]giX>RuF*?4FaFZ=hs*IHk;N%d5T>UqqCKR:,)g3e@Dm`Xbt(b&qX>3`Y%g - ?;8O$<2[TILG`tNf=C^31?H:YmN+OIa,]U9k?RJIF5D>kq?K=CFZ]fp8gDN^^E!>HT:pA`S - ^[Fj;J5S=sNVMo&q->;A^!'\7\Yj&emfTdQ;i,na];?)':)LS$^pJp8 - U6=S?Qc"VNA76PW`/*m![U?ebO7Z1_MMMJS[rcX^fVOl>u-1iI(:ejAVZA!M20![KBu6c]S - k0+7ohE;nSs7_9V3(f9P$oe-1L_R(APA$@5-nbunA - qL;l3eu@;/o_tZ#qsmW:+fnun=qHc$dbqPE"gD89L42j-E2&8n]')1;jOX44?O(Oq#I&U]n: - :Mb-q@)bHS@,RX02VC?JNi;!9V(HACAV]Q3kQQ<=L-;"kNH[dTI+Z$a#0O-*km7$EbrjmfP - OS`Y(8mN:K9o>p5C@ij(8s!e`hM#;GLWJC+lSk4Jab!!20ljpYsVMID,o@4+lnAEIPTCroN - ;n3r">YlZNZiaFPJ$dgO=nM(\(@eRfbfkm2PDgJoJ1hItn%>LU.Po4S0)6o_MnY$jUV&F?Q)R6C_n - Za#f[2X+r)mR'p@*'BB#S;b\ADr9,ECM2T-l_,r*Md5MBltBbjW8F+*jP)RnaR\UN?<.u(f - (JDL]&$^7)H+,blA*E`5`YUaVQ5J6n?3V.;YJnq&&Yn,-idEnhD@E2'[,q#kC*L!-$]Rf"u - %C4"Qd0^iEZ-3@/]K-*gf&nmNJX-Qd>^(_QoeV`Q$((i5?H4>3o]7aO&(6@[6l$A@OTZB5k - jerOF<%>0]^18'el^oboGm`OV<,;pbkNt:41ZQ[RDl]3'[JK#Y>+4?o* - OF`B84`4B#pBF(@#b`Xo%7s!bD!^hQq^*iZ$P_JRIQi!@TFb*E2P]M_"d6`2Qpml_g'4Q-f - 5Zk5S\'gZpZ6*qXu-?R\/Ya3U'"Kn,=+AY?MGR,[]dki.6oKbl%77;5h3:mYFPLah/90MXC - VUO\$1[;Qo,(jCFC^FMQUia^J6jlpU.koft1GW\nb$`,F13AIh&uQ.1i9ommmisYAV2V`/p - )A+P5D/6]ju9qYohoQNH=s"GV`0OaV'O' - bHMohT]*$aUccbBhk-JD)jV3!/A)jp`hpdQ\mV;6p&u1/L]@ekIF89WFtaP\rm(%\TZ26`< - P^_*1i9l9;PHV-8#9dPXKDj\4DpC(o..%R`?g!0I#OZGNW1U602CKYLG. - .\Pu&RrIp-'@pK479]@V86)Wqp$lBHoj;k;?aZb@:h5^*%"OaZoH^K1pF-,(O"66uU+VB=nhUHn=\gq^A?B)CA:M - Xb*-CAG.EjmW@pG$_J203t%F14;RpH`m[7VU>D8Z,U$%2f[Fj*>]nT[srca`I)mOI(.@JpO'53KhLFBD5TEh@#'1[G` - LnkI2D:"p[N_lom_0QGTkU^@\7nN^IR:iGp]dA"a6R5S3+X)E-J+)-TY8U"I?jJJu7[.p?p - P;-J.5P9_RFtj#q"ShX7KSd2$g[",cXMg93fX5DBC;k=1;OQ%G[Q$T; - GAX-@@Qpse+,J]>4l_-XB`aC,CBn_fE\3"GM6&KodMPb8KM%p]4f+[ItpPkl(f&@ok(a"JF - P@8luiAZ`Ak8:L$UEEgS7+P&m`bYfe+B[GG(i0OJY[^V%9k&Qk)GXcN1PCmbZria - ,&_Z?.HX6n/[Nee*SbSX(.<,u#2=DYP;nf/kuH7/6A;Bk`d+e!&h/9_h)IfgnuFMj4S'O"! - #QPg,:MH^eJ5KMnk(Yfnn5MJ=Jso6AOs`J%d`k@m9r%9+X.Ns)]S>Su[\1\f".K&U5!-5dR - Odj;Y$Wj;]Rq[\F@:=c+r3F/,C'qopj,PKX0;^%(L#GIl(o)\\?WAB?,pf/(@oVR8*Zn_dN - .SOCpH.#Q'i0aO$"H$V7?oK!8.#!qr4eeBZVQhqDqCXD2JiL>eVn.;SqLPS+KrB^lBr;fg1GtD)1S@qZ>+9P06DW%'B02n8H>"aLefaTb&GYj8*Mtj&>l&<2R:I[*BLKCI7p - 0g&flaCm(TEgQ+.A`VHD)oi"Jr\,,mTr;jMo'J6^50l;0EPQ%oDk31T[%1Y$$+@eo-5'afZ - jH=\g$_oR?T!9GJuDJdXgQ]0QBD/e*QtYG"rdkq`b-2E7g>.B(DZf@>j(2G1uAUsSI0k3#r - A)B72I@90/)],eCCKk=L11%@Pfqh?DC/6sSPX:Y1BP5DV$3,:rf`X33t:I'B6a0nnGLLH!D - GZBkFPIu7`cak]kJbJQLmV/0D]t<+6qr,7Njh?*+^,RrP61_RsPFGdAOQ&'M7E<$grf6!L& - 81;#%$Wh)@"\[>UOpB:[[@Y\#%FN4]N`REqU-(hed/k@"'XOl4"8&A_3#]9nf.aeErWRQ$c - )$24phh:A@?8Y*$Nc-'p/3l"tEn@/]:csZ4P&JP-?`2P_bD$X;:@BB(A,o/5[`bB1+f0,_0 - 8^K^lr?.miZ4pf*G:=Z\.'R+Q88e2DcOJGAi1K:)b64F,16eFji>D3>YsV?Xeg*e:@*". - 5Y;\"%Ll&Or>>MoO$>k57L-r-JZZUh$99P*bNM_*ddCgN3=V8=_l5o'r=PYRWr@uba2:Ht6 - e%IonAdhfX_CkVU0S0&Dj"cDoNAE-SLe.-DDZiG@"K'CNqo,sKkaH1I<.u+UP9padSKD_h1 - W+T%_u)mS3'l(]RY[M==?TuDdqhCT&(ZZHf"udc#:aDM`Rg?Rf>?:p*Kb0nI:j,78Y\7)o. - iOn`*bZ;8/#i5,ciOT&]m=MhPa9#,<.O(V9>.m]4J^;^Kf(pcB3A,53' - .nF.(j^)0D6iE<]:R7`)QK![d3Q(1Vd5%HNl%m[M`*k`C5X"J$`XeR(`V\s'pZk,ql[eBfh - UUCJE/)`WB&%lK3Hd1\NfRd*4!h`o@46Y*,AP>r - XGN8"rX"%:rb>@`dLl]<9CqYQG#?.T;#Sr$sT`g`[jqt%P2Bi\,PYNYBMacYN*_\K4;4^]/_MQqpP'1VnXN3#i$%3#_ - 9f[%jsJ;#8iuO/[>g*PHQE=Vn98F/CRf_b0M__$>gDC8:&`&2$D`4K33`W=OaF#PqCHlgMQ - [(S_!7T^#*c'*$,n+9$lTHGm>Bf$^_Ri#J(hJC%nR-lSgmF:=jE6/Upab2"t(3pq0+BbPmW - bY(?]jHfq64=3YaXF+*q@Gc!!L@d'P]:<+`UiK%?#r^(4-E6X5R0UYC/Q - ">5Q>F/psL1?IuB`gqIMs-kZe0XXHFk[]pOreZ`ofKE$<])I=?kl/M.%(N4Ve@t@5j`jD,t-gi - 4hnGGY%7kBQRd">6']&>KKMTVDpSF#49@WQNTAl3X1^I)O3Q@SB]FR:dS96Fg4>8N^SMR7_ - RB+J`hp@9@uh%Dm4!EB]&!t7F*Sg=Bh?cDapGPQV^S*,(rLSEa4DG-;X\aGAUGMY9NV7=.h - `,9b]L&S3*#%'h,TA]Qn1>6N9#JKq^J#DUN.I_';jdkn#5>WMgald[?k4FN56hVqTp.>WNJ - Xqf2U7^p;J-Ll[E:j-JINb/h^.F45rXPjh[0]aDs*].,C!VJ@LQ1ac7Dkm"XKoP@1#pEpoP - 7ZBJs?3ac)01S-kH"-Q97m&4q[7`q:H"j,tC*j#,JSQ8ge_d)(j+SC.]DpE3cRKoh-/-q>F - -.-+:CB>Z;-NT;-CihVd$P#b3uGGr&YZKZ]D[I"u5Y'+?f'RskT5DC%Q$D1-HD]s76-m`p_ - jcm*;P15>QdH)u\a`neg4Vj@r&MQR?_[-tk50S;711jM/R?KOA9_jh\AsC7@!GZC2E7h6Zo - RAb-/_@?WAj).M\PPpCRqB\C8O7/50bA#ni+gGNN9pr@8@$97aSFN52H!Hq@OAS@9HN - h[fFgYr=o-`o5@ZahF39&I(bB&h!9t76gol@_*X2mYdO]2W1#=q4Y,?_jJAd9a`/#cGl)2? - M?%iSj.Os7mZ9>6RVT]W9nYaq\DY+IDX2DPZ/6C]kfUJuQ%,p^Xq>mmWT0'PX6V%lQrb]n@ - @)R/Z5N9c`t"[,K.!-qZ-<32@NZR3XQ9F$FeBMmu1N&on-(/TKgi9IoTqXIm-b3ZXarD1_U7:9>G - uOq0K`DGp::dg2WjQKJM0=0%=mDCTZY=8jU5HkcCN**"r+cW@JP\rJ.O4ntA(M(N+A*X6<1 - ArC;0IAQP+MHN.,\&,9acnl(0k,NQXpJZe-8?J*#&Ng]Boo"PhY+j8pO4H2o/7gdqMGYIJ^ - 'Ei:r')!D#U!j/9brnl!JXd%;!o\bJ)g@.Xn+jPD#hV+.gC>6tr[F;-T>81.TnQ']hp>4TBR - s.%De\BCtoWMLe6#hc6aGFQ4FkjXiF*%&5.lTmfd0Cg2.&*1]./pV"-0A`mMCiI6OXNa3pF - sKRl*JUd:TPkDm7.ON*.#"2UaIdVV;jnSE^&p(LsEB.S.\hb+OLO,M'H1++WKf([5;_)uUh - tGuS^=/J^"2Y=4]KlK,Pak."2B'Uq6R);SZ3(8C3Tfh[P7.'PrO9p6kW - 2f3ujS3aei,%?\]NKB/U-\SdF%&ejQR60ohQ9:::Z7k-q\jT%D^#X3S8Qdn^VupU7(f>%@f - CjJY4tD1$b837Z687s:YgAtD;Wm;9&Or0p+FO"\%(A2p1MmX3dV.J@s%2'W3t.%#Xaq6oY&q2TY"QsTNIW0+qtXM,N)uO5p@<6Pm)6W$ - QIPDigMoteI@)#"tU6'&mcC6Wu0clMOX<*//'(O_)?nCV#/%ZPA7onP<;bS4DSgh$X>WB-601]T1&/4.H[_Q`,E;fe2f.Z'*C6tBar.5&G/:,[u*0XMV"`+')6) - *D:\Wp@^1'HB%/*B+C>`nYGAiZX2:E5F$"^.EU@H1DO,0*MEZ/Fq+OoD]\jPp@J=[IDQ\>* - _&inLIIs'^Ona)s>+skeinSZZJ8mZog0EDQn4H3HI>J"8PJ[iC"eX`%lqO-lBMU76b%50Pj - 6'e4?aL8e(o//K#$ZRL0]>`#tc4*WSMXnRO,ueKDHM"S>kBqTg2o`&.Ys32)fq/6p!NYqF_ - (47%sL/>EarA2'fj[[\.+3/U1_XhgcM`k-1^FK8$DOUgn'MJ@*tiVf:X8!/ZiSCh9h_r20d - 1W;FS93I`US@:'O1o[9S3gj[s0MROZ[?/V<*I,,`&R:sM"2fdP6_o<$]KF?RZ:J1^3IC55" - H^hoW^rA3/kU:O<.hp'a==!G\fo/5S+)F5#eGR%YU]1"c.XbHdQZ]NQs,XVuS4/" - Diq,QB1hdu0(._\!]OR+aJZ+..Fabfo'A.#uGC_EhVu.\*D/K5Jbu0"d9P4J_"4XJ\:V"i% - 9c68MZ#RQA5m@2FcF^kiOW!M)I0rOs!=:KoM-+]:3/n+u?i6neSQ@-[>ef'S+C - PP!5g8`*DUV>fAnn5IlaTVsMM^*(.J/b/hfMcru.Igdk-+"V(;+[NSk?'E]/0i&b'O5VrR= - Ha^ULWMB9e^[hIQdF=M0s!.B/4.HS;.aa0B)Pi="$(2m-KaL]TlHVe/4=oU1I--gf%RHV!] - Q;.hN#^-5*RY*?6kLN.iUINn8"@c*PS=Ci,eB6pfF["-7FFZ)@QL'*f9WbG]1BY/3=X@k77 - DR)P(Goa+fma;VG7uq:[gia#kl0;_am3FV4@_+o9_oT6)>S+\\sB?4H%-P!`Vchd'H9]Pmi - ZBr/cg'SB==$%8Tt"TZ,<4^&`7;;U7jr2BEHS[/t1_6*!GJE_gs)7FLV3;>lmBF,FZ1,*b` - "m"Ee$'ujf/b/EI8PT)OQWn$cR4Lh;hZ-0^uYr_+Xc[<>?64+>]du`TE*6V>>@oiuI+]?,_ - SB9Bcr$N8U;lKQo/E2kVK_MZ`buTNC_\/+ - Om1]9_=+"iVX7%WupPp^.VHYgL;FU19(`@%>$tm@_&A`GG(^-/")V7K;lODfM1)$(:0nRb^ - C)HF,G>X=@JZEj^:!1$dN:Xeh&2aXD5Sb-Uu''7b*s].rc9fnMO/\XVgW5.LW?J81us@4]) - \<@A[&GRa)=M=8dm._>.1R#Ln0S=3\K%XbB=CpoXVuNq>t4_$6>OTG8$JW;4r-^r.6d:e=L$)*pM56CJ]8 - [@4s%_^WdLb*X9p&W(qQh-7YI]VX<+,?`hJ2U&,Qm-%3/l3")'+>lQ$%)#qF>n$^i*2)#mfnJQnC)82 - S6?g$%2?L_]rPL/j0It[DQ3[m - 3XVR.)3nU7-@Rmje6C]([L[^3/C.Os/bHBQlUH)9X\DN!i89Mm]!OuLDb$WEej"\%#l_@Fi!h5j3?k@^XaifU5V@2GjMi5$cRL>FEO-Z![0 - ,b4n9*13tdDIE1+509'@%#bm2Iq^.i>grf/?<2B-:YD9ekSeIl7'RMR$%1MQEe`=)@Bqm2& - *t.4]Aeq!V.J9j+bt)T?44p(lL=,]2$`ZQ+Prh;g\[,+m'.\!P3hPPkVQ8R*jjj;=NN'jFQ - '^5g75D)YPm^:&j@DMW7*_8B*=F_M3s\`\`'5e?"a=R0$q(3KMQ_RNc'LMbOdtneMnHMi;c - &=]8%/=iI*CUH+%>lnXQpX!E^9LXo".p4Fc*8lc^#;ECl7V!$;kW^b9dkaCVs5rf7>)TC16 - ULP3p'.\ZX?_.l[o=M#A\.[2$e,>5;O)@h - )9?lOAMGadft9RFRtOqWIE(&<3$3VLe"JX6[o"kY.jCG(rmgBjjJ*@9'%;f#&>mHt^$<'^G - (M&SYS*C*?WK!jU7sS-BT=0'_ng-9[0-'<1!]QB9`_&tm,k - >eK>!PjS%lk2>\'qUScO]%`5*G@I>Se&mk>3MI+bH*6Fu.L`Tt - &Ftq,>r9rSSA,@8^#ri8!Uf\Lobh]=4^m;-o$US2<^qpg-W^cml(21##4WP7jm7i[mG@%T\ - 0`X;0mJtp8;_8d?ACTL\F2=!cG/lDJU_8J@(*/tRC_iIFS?pD^tnM!HVbJqom$N.rV:=aD@ - YPilE1#/#lsTmh&*"6&:Pl>lKsq.17ZIk1sp(s)3CB!U2gK"#MFn,2h)NK;eTIiBQ!ETI@p - 1DU%eS@$N3YZ)e)j*1-QD?R6h3rRtY2&5JT"Y-OesCd&S?/8$`5\4deGaRVF:lB_.&cYCC< - VZfc'Jk\M=5D27*8c'+asuZVB!,b - V;U&L(F+],Mjc#o@`Pr4K+U?23Mjt'pA(gQ`(\;#G3)N4:8k.W,+SY;9r0Ng\n&kI8h@6s - @E5qB&(SBWh:LF+:[t49sPTpOS,&"pC'?(gt605RJ2WL)4:>fRiZ>m#"$e - dM8S$7p7&Es7Q:kf;q1Qb!1R_$Mds8".FPiZGkKE,l\qH]M5nYRq6 - -b^+VEp.gqLX$h]rF"@caq'Fq-/5J?Bt8EL"g*Nfi;'p*Msf^)d>`hnt!_pF&Lgsf6=pjYk - tQ;+1M"<#&tlF4!I>=Ji;3h(;bSuJX&9T^rebpfK@/d24Mm(F4p?#;akh,STMeU5[.2+ee3 - ,GSV!VIf\1!sgO7*)Fh=%"C5^k=H\=$2@tm*lE^Q+V?tGoKcA+ode*:OK]mV'YZpsIuK#+& - `\<;+-Cm>r/a&ggWp3V5Es+eYVoD3lG/J#^RoPsjA^VH'6%mWHt#X6&CA.Yd\O0fc/U@*%) - @&V4h+NH3p>8"iXY]Ml8_pJYn\E:GF^BOjSK:5s%HW>d(qD8'.a-3r]eN - 3Qm^]@a]5Hq6n,kaG3VeD\TVSsV4?GWV1VHXbO"OQ,kZ - WG/W9RQXTikE][;fJRQ1]]:=IQ'DA3s(jCb]T>OP[g^mG!*JP-Cgtk[JGKIdg*N7"4 - o!n'Qsc^s>lLGZF7Q0+`*m9Bp8-QpGt=,b<;LfSi76MG)k0^_'dH<5]pFH8eX@]J):J0#KT(g%BgO^[VfM(/,lla,_Sd`-YadelOY[@"W4 - G8dK_E!C/f.X5Y%)@c2n[3&%aVJjA?P#X]POW=207VJQb_N8CrKq:*aOVH,gckN - ZT:`];1GhQThA[,,e7Ms)]c_KE!YDHMu7=+cq$g9lrOS-?-aOu(V(Ko`T%4s!e*ol=0,O9& - n%#G*=A0O)L@Tl/:OU35e#^\!dbW/6.&se5Er>ZGUHGMB=[ZU(8)3TAQaqDuLK^>N`aQ,[f - :t[>9Cor5>.+&ImU&\@h;X'[7uP-q:ODD - U)4F4&UhkO3Hjq9VSmrBaTSH]m,Mpk9T/Zdg@lgLW6LS._gAs%J7qe5obQ8'NpRKpqJ`=*i - G8$T?XnZNp/VQ`agZaO9Do91H50s@D@0BhJl>_5pE;AT0SBMa - FU!WnTa="Z)(@]WP>;(^G-\V?:6a2;l5lt4/ATCi&B9L__DJ?jZ$1FYZ?$C"%-K[P, - 6->P`THW'.&)4RXTDoJPBoqLhFWjR;[[--a!P4SVrGD`ZV-ChqM>kRrd*qk&LSNq)6-h4)B.cB2NV/+@O+HVI-:['>8c@Zf:coG[ - 1nRLI;(>#E+c-Z"&[9InDG$nE#@/4G;Y@C#],45VT-AYpAj54g39hePnb\okHtNa+Zf0Q"C - JW0J8F4cDV>0Y9G@5)1dV(ji2UfK!!#8QZ"Tj29+;(Q/*dn)OfaUC\ZhJh6tKij0S;n - 9sYsQS3Nj4RJ)L7!tqI;1Tm4T!?f9s"CQ-uLNHt - a?=?h.>U_lTHbiZ";`@R_Z4EB7jR$*U*]+Y1sZD'9Fl0r4HM[ER?7=JcNeM",W/S2GIClJ7 - /umVY(sQ(K.(NJ3IhVF@+[,@YL18XjQfl[fSmCVd9EDrhh&gW;d:LB,Z1ecd.HMo9&-lP_^ - _`"6r6NlbESd(JH'gYU[pFB?Nc8CQ&nF@sn_n/*-"PiSC4'ErjIC1un:XZ+,b^=c0VBSXdf - D+MR>N*_Lq`q\^;*5$c9hIZ-a2N]B9pjM!\m759)p84haVcD!5=@fiW6sE$NS3[WHcKoCmV - ?RhrBo?#I[I%,-36MnT5*aRZ5/rRXT+(A%QT!EFi-5C^fkFq_#UH?j=]W6[*$-s4oG:_71jS - =,'OduE%CQ+$7IqcbVA@bO4VYInH65T>r=IELa=EbjHd)])koJjT#,:[WOg'7L_<'=@W+r? - /X$*F#bhH37[n6tk4sYaJakq6EY9D9>mmVPi`c5KaHh@<54R(CcW7I!.[!KE'T,2i!C_RaUIP;5 - ]YgB!R!0Z!A%9/pc4%=Y6,+l`/%acqE7O__T`_2/65-6Lo(WcoIT..OAcg.XXUabh[%_cbi;[&OR70 - 7T`=UoYI@5/MRU:B[eJo[rA5R7\L&]:q0=ir2Kg[.0T[)BbYQ5Kl"K,NR/TkL0m_Yq4k0?. - ^8a%WA+G!tVWmEHl:\;FXd1`\,(6PIqotYs:WXLe`gju,(h'L)kmWj@;@_q0&( - 06'.S?LH&nd^D`O]_<+OQB97*/7l;Cf&Y5<8qk-?VsRPW=3(<2(":KUo_<1M?r& - -3'jd?X&58GE_e)]L/BY/l3r"(Ck!Bii>[U8lOUeam^FU-VMpJl?>f,CL&r!.[\N0G+".35 - V_3KSo"FG''(WID@hQ$L@Y""$7O&PZkmV""65OQ-*:;Uq_Y2SL`*uLhQObXF%ktG1GXI&40 - [6um.R$h6a"`bs1".'O:_kbFd*8grA;Q2]cX=['>oBrH>1-=C10H;lWsp^K=@ROto,fha`k - ^k/1lMLlE+23JI-C$o()&hi'66C%N>g-N.8="SWntAQjYp+qM!W@Y,LFdC>&OFJYE%VJchQ - kUR[,WCZOcL7M`hPD\q&lF8eC4g0G]h0fRL/$??$r<0d'"Rq]S>-+d"D);[2h]*2X*;^gpn - '^mRDcpHOl=5AD8OCA:G_+Yq"*L\!;+X[OMaN**DOjpuZ"DlBiN!cmK79&R*Ae2'NO7QY[eWUcc)kqU:n!]r.,g-sQ]OQ\Uc - R>l%g"?"4@:8e']VqZ8dc?)1lgq8e-^C6&J_TE2Y;5o1`[l[@hVY]95_ucDV,CEEDBLP+TQ - R]"JcG4:fpRj'i[_&Z')WbN7[Qpp6>YX'ga8^?Mc=<)`21VP\R>)]f9rN<)m7A`59t+Le,d - jodX@T:#p7I@b*:703jdc>h./*V`Y6##dXd48C[;tm6N":D(%8L;&'6M[*nlSY^qriK]&j^i - )8pW"3!@%8#e\?)!<0beB7%L;D(TJe0Uk`/)kTGWM&G>>sP@;as'K'Nd - eS=26n4!!-h8VeVNuC1(Ic!5E;H#664U?5#&";`@M&5@fF;?P%Juc`6ML%7@qp@).R"QK)` - 2kA!6qDUfj7-U>B5l!^`O@J!>Cp*E"JbA`dT+8.Ds:U^^t3?,)hlS$31(CbCSJkRBbei$@K - Y>S;Yd-`87%`42:@hP'l7h1[HZn_"Ma^XVWqXJ@J>>R(*m4hek3teT"B_9\d6lB]l&S]/iC - &g>5Q\#2QYQblM$hh(Y(;1tL/uWhJp/,15QR5(ccM(3Zr3k0HG2$m-iW>I#C:>=I]hkPDlR%[JFCbNn%;&FB - NSbe<dVCtm*H5!N4sfsn3sB4/B.asc-[6mhc`Q#c*aQ%Er>L8b - ek&8D)R`62gL(#I>#+WCA+uLB)-5<95F9k5r1NXGd,%o-o^=HeFHUH2fj`?+)R6*HZnM4fR - Hd8`Y002*r"!!plRu^Q#M!pQ-rHbohAq=;e*4:7hVR:=^RLa22al>dPY\c=MYFuf(!ZFn0^ - bm/-c2l^9\/2!H-o439G6,N:I^^9DJ+AFg6,B3GB;26.^8pQ[/tIIur6\Kc(L8q%b"()RgI - E5udlNC1\KS.Z%t9#C!50n#(pXF`&'_LUfil3.lUGLO@W+BWPQ[3E_pkj.VQSQ8E)Npn`F? - 4`SoD*',%6"cJ_Ara+^Z95V&N9.X1;,g*/B/I*phUa$T>,WXPXbdd-aR.X.W5>:kN?Wk.*3 - Q$r(a,mjTSG/),=-Jc5QU'-;jUt.>)DXJ.Bi'nlT6WSTH2WEM!L0!HPo,Ki)-8`JUT%G.l^ - Ao*KIt_!,,QttTNN0Z#TN4hZZJ.##0,?iMdbu)O[b$q<\6jP!A$$uLWK\Q1WO+< - pi*T+GgD_lU)_P'Kf(C8Y6t/`ep>)`-]9G5BP^3Lt\d=Vt%9$FB2Q_P;RnL:dV5tKl.<:oP - R`e^?,Ir0$:1VAq4'5&[+?]m=ph9l<`$./'qPDE/Z:Y5&U%&a=q)u0EK37q'=?X&O5T?(Y& - %G2U)\mUC&Z?SrW*.[s6M=b`c@;lHR;BXS*"nL9,gXd&PI98>pg&1>e[iXa[/%A(7IL[?:4 - oK._-B4@.7Q#Znq%P],eJ,]qg"h2I@q_1Ld@)XKK4GkTt)-n`m'4J[hX?Qa*r1tQQ0qb"@b - &GbW4=kZ:3nA7JtmCmhG<;h/LdrUkq6#oe1[G3d-LeH>SjM%Au9"Vn!8ARY-ph/!. - Y-/.-*&'^Wu^uY]olM.$5;Q'F=W>e@K,B:TrnsQ[(gB.reBi3.2#L0?^&Bi`@jg6;g;7Cho - WgeR>gPLa`NI&1m>PEBQd@ETnbgB2dl:0)"J_>Qrg"i:S*MYi1Cnp2th0eOq'` - "&2`[q9,8nOB_18S+Emi_nY! - I^]HhnNp+1CZ:]Xn!WHC+*b4>=BBF_/k/D_^8LYYXZ)G2R:V)bKUG:OD[[9%i0]tl&6QtT` - Qg'e;$N?W^&.4"0(Z'CXhRIj?\&5]Q?(cRRZe#)U(BM&F!U)_iXBl:/4qFB5D2Og\e6^Df$ - .%Wkqr<+BfA8aE)ti9_MBkTG[)tSH_V,40&+H"1>bI/J"D4As3TlY$Ccj)nhVoi1LTnLN0Z - [F_rQYdY=7_u7"CF>"5=6X_iiaE%)L4ER?1$%qo?nZRdTWuN3k+$3-2*2)m29QJ*nfL2mIn - ;@RGR,@4aKr,EeYF'f+?J.M/"amf@lnO/rQ)PJO&.T=>V'2$&(_) - OP"Y=+VBQ!ifLX&?%X"c`lp0bP^EWX(CZIs?6@540Dk*&rThJkQH:?Rhoo - _sD-Thss:=^/10]T]+$V:c]o63<4,US\m^7=eU"]I:+`jaC9?51muc;!jbRBsh.3QD'#F^M - ud!f@O)HhB)=&0lMnQnXBM:_#a%kgbkl\M'M$*f[VlCX-'RGnrpMZ>t^SHk/b*[[X9s+,j< - Q8m&b^p=p\@P>AuhnJs`F:G>_pe$]=+K:d.Yi0aY`/W=i35!=1h'#G - ">o4-;J\Q/F<:cT0U*pl6EmgM$ol7[2Gh;dN'8CQ+I#>+7&q`)Z&bpl=Ke3Ub[22;BZYk,W - iDM^Vl?\"P,$#/oR@uS1),Kf8?t%1UT#_HR]!/8R]@rB%j'J\@g - UNc.dQ)\)`4.1iBCg/ff2J>IS$pHYh+r!KQ7%j0J'ZG'/ - [<8`.I>XNrLiq1\H:8e&:n(1X-"idPT3;V3pGVnoI8:Xg<@0-%<>AM:=&p&uVXY@=+R&D&O$G.O=#Jf\?e@7WMTFH:D3JPHXW= - $I_7FOQ]Pfm_pV&!*jh5V<=!c+5/9b",^=u_:Bm>Rk^$$6P=1NStnN=96b]>nsfn$+o4ID8 - 22'AmH76,@[e/Q)&=4VN-G@0!G4dTg8F`SELg^Th$LYc1&U=1a,ni3ZTB-a,YiZrn\9STilNJ`_KTN3aK+UHb7obIm'u[VM'4Q - &ZM@i<,76$b("J]=GJP[7R[`7dO"2SI2M2\phQt_]XR6K.bqpcYUC6-V>^K"V=aFj;(XaRFmeP+)94J,b- - LdOcm>nnYBVj.ml-Dh@3.meWe"nKS:b;_32i6i!GOt'a1\Toi/e0A2eQ#XZ`cO*o6.rc3t$ - ,ZETj1l9f?G\Q@0:A(_B!g0Z#Z;bTp'aL-%,V.#L00'"qA1M5Eh*6rF\]L#4(i[(SeK+h:H - @Z#_bBe3;reuqYY.2GFT79HJM8g3aMs$O*+R3DOYTC"aqKCY:/&>^9p-eC,I990aoOdaWGq - U1V&q+k!(Np[,,EpZQ"`_pL=-,@,8uL0<3OC/5=JcSQ&GE4`W<.Num/=Rf*DRJ*.(++H^ai:>")^_SEdLFqmaa%e]40-g:_:C - #7=]'>)-hX@E_^?SfVNa$R(Zt['[eX4b"aZ[1quWp\)hC87#6MC]!FWPXK5buE_AGcL@6>J - 4J=V+g5V81)^^"ILoO3!/(ktkBO[A).%V8MK3)MbMC=D8]UJGbk?d&1\A/-G>&gH#`j[2]c - oTEu(fr`AbG:+&HHb`89It6Y&KedgIar*\T@;IYtJ2UIY2hnA+S8"=1p0X0MEY9uC^u6Uq. - [_*f0G@+@$t5WfRPR\YB"[B!F0\,+UCTKoSG4&0o=P?:DaA&"$))H!LX@"f7;0@PUNAo_!u - P5gX,mXaE:^r>NtsL`Gg>ki9?W<52U]tij*-ODgRSaEQ0NZ/\`F$r\ - 9?7^Yu5eN/2Enc*-F^QlSm)7dOM"G'PRUUG?lg)EOpPr[&),oDA:d'Hd?]t(UKFm7,6%^=/ - \a-nZ)hHe'.GZLp%I<1DCh&FC[D_cc(\$Fd(qrS0?i7l"D56'O\#D$hX$,LjF#N6X?ECI*F - $+P/?ZOZtc4?1@NW(^luO"i6+g*%ElNTSac_E>lNa1Wp6YGAH:PK7K:PjM5Ta4CKqlcY/QY - !0Y33tCB-`Q/N\65mBn/(],,BC+[1[5tRPgI6=)'&CJjpHIitHae4f*Tt+[^A6Z5pNbYiZmti4,S-^G-a1 - *g&91u7`UrmBe3%YHn`rul%)^Z8mp_7H4(4I;7(hUshc]O(=)Ui,m`2UsR)p7Z,jDCqVXe& - `af#!S0G7OIJMZ*d5Bn7JpODr[#N:%pJg3H5V"k)\jZemZo6gSaqAc!*k$-MA3p4lUo/j3X - rlaq_pYX5*kOErIer*"9k84/p=+7p;qgWhYrZB2VIm<2qQ2#S'!FPd\9T6qMRnU'uKs;jtY - qo3260GX#(+k`3][I_"HW@2+n0@8G[>Na"@bj%cdhM,t28dtPe(1f4fJ4B+4fV89+;@+._^ - DrNPlOh#F8E_+(r;FS_28JO_-i#)*4gZ@#FljNPTRaDr]Zfk1Ga'A4#K3[m(3V64!M2O$n& - oDZ\RlrLVt[OY^$R8F2H:D6KBc9oIn)b0Z+SZ_^%"T1c*#_VZm`?Zg]mm#s^UNc*7W%0cJC - u_\9-s'Y*HDX[?#L\iQs'<3_XM_MT,EUDtl/*At1PUheJ_"4f(B2B4lb7`m0;>n]K<_Vk\ - 20XY7O2H_0U`WRL]clm(n%BgqT^qGca;]Y[//1X'Kn$(;R(%&W4W>Ij9Rm?A";=A\PjKUX- - ^b6Qb?<>_#p,oUROZX@)(pu)_h#IM#!+1qo9D!a5h]*<*ME,1Vu6C7H6>1ZT1PJKZI,A7S$ - Pm\VUsJM(I,5/F/3K.a^6&of2#K^f&[t@b.qc)9>t(a!4_I>?WW5*QLe0[E2?)gXik!ferZ - \2A*6UCjQohHkmEE8K=>DoH;3WEOsYN^ANSlFC7X-T?:-0^4_6^GUATt367n/_lRRi]E:OF - "?`Js5[81p$dGepOu6dI)q:%d[$3hu\iGFd\WYpW'43L?GsoI4a/NB8\R7qL@S7u[bN!n@$ - mN[5ZU.<-*+O.R"CAgt-H7%>b[e`"[&4b"W((S&8=TZIU]Eiha2>i2b1&U;Yro\:<(d@U`$ - EAF#aLCCTd1"J6pqF$<-1C\7_nA67#V]!N(V3^9=`Pu8\DZ,be-O&]hL?Bc6E3[qs(cJ_*5 - fS+b[bS1O$hQim*eQXdmI%>_l":b=JuA8AiNie&fi)o#U_p5^\\hTm]QidD3ZJb>abFFI&, - 4Qc,C+\\o,EFLmr0SJti*cfG))AE1YHlV:Dbc=1D&>[P5+-VsC=csg;+Zt;jfB2#C?5R<'/ - *,7Th"0kdccP3QFb`G44Z-[3#cV0P9,2Q+3fZ-r]_#2p,FS\S)H-<#?cckk^?lq=2'\^k#L:8E0`3pnA8+/J!lhRg7`5GIltsuM5Z%CL9,%Z[5ss$NF% - K%od8ZDsoTr'aQoV+"\\/j'R-@Db]:2ck;Z/Z*Z+\QGJPl'6dK96iI&&]T44G!2RI):oPmG - U1-H_kdLeS9"]d_8*.a$P,X/tj9*>$Zl64t"e`(Y6fdATu#g,Y]]7t!9cMk%no>tMl>bKWa - ]F]XoH4Mis=^@\0hoRkX&=B3mWPYFM;N@$L$$;A,@9[,"WaQ^e%.noc-;Vb!l/CN)-%+O@i - <:psU"S^A-psVq4bCgL"WE`;s3E9p0f-PI#'j43=,YhHd&Y/"3'a.31F'"WPOMtR#R8ZS&3 - R6Fh9\h0lm1)MV/B7&g%4[)qWFjouXcqMF3"ddnmY1L'L=2bKte&KJAC=YB/<_Z06]WTm$YJ>95`sn - DqNG6R(p+)Z@d:G.3F])(ih,R%Qf+j>"265HHT%?C3=&f<)9Z#Ig>L%pHg;_;fc'Xp@CDU5G'cb4;BrAi.<]NeIULjcDN9s2/- - >>.a8:fYM?[EF@H[+5>uaK:t-jdf0>A5k_?b86$[J=LE'EP - rN#+N`!L??00(2FJ;d;5.>C6W"7j]"r^ftAe:bm_b>kt: - #t;"_Chr:=:2S_iICh0m#nN>C?@MTs+uc`o(NNPj?h"Q7gUhgL^F%J`gW`)7SNi8,*u-2gu - Kk$)-S>A_a?jjDqU\P3O^bpA!N0UlHULYh[V?NpdC'fCeY2VOFTg859^[N"3p=5`FN>`I]; - Fd?*h,iY(U@6lhRbpUZ9.*h(70X)R,n1\>P6fS_Yiur;M2DaA_1uhUoj(:40FuSH939-;bj - /+aI>AKDuklJV@?G6POR$^Gr'ELOu'A-&j1Hbp`3oj=1jCUmBG":V-0nd84K8*!M<_Iub9\ - ]N'>RfEB*SZN:$f0>oA,]BS2C6]k-K,+NhkdU5Y#Anc"lcL5ikMG'E,(Gis?F".jhO(b4Rp60-hU@K;,A(%YV"Zs8n/ - e]re\FQmA(ojt5)9Z3u*e`[Xu"_c;)$CPFt(bHcZOQdOCkpDSX2O!ApPj)56l"67GG*hHJP - \Bl'MO?$Zcin%<)eaJO^nSNN>/5\]$3BBk""p>4Nhbl/V!;!Wl=QkUi%_6T0*0P>YdSu-ID - Jj)oA.CXg9'2qhQP.@KMh_KgC;9`-Eq8R^1`>ekab0K77V%)8.M,!0K9?=qnnj^*UD:ilfP - qIp:oqu_!DiQlmBU92T+lN`9^O?RQH9*1I8HB@qj1]lUZ]nl>M2bbaD%%$@Y-S?I/!Cd-VU - rm3^3u+]:>i&2mjalF!R*`Za+iY$s;mCp)L6m]fn`G2Wlpfl#P]oUfo$l"b-Ee88[Sfi'EU - %PSQ+7+#9-G3A:JkjFc$m\]:;[d3A$m-`HlmcNh'dpk'F%P-DXg+M9=(<_46W3iK)2DLD5m - e?1)q!XOEn##rHaceCoonnd\h51M7[5[1Vguocsml(N&FV`mN - &`ONOK2\Y^O'_,6>nRiX-G8Kcl+7YJU'*qf^Y]"O%#`' - mQn_ml/ru[PO-up+@E[N(%2^@l`,k>"Klu@(a9"sVR/^K^h?R?+b-4=c-)e^T>Eo`lr'!K. - tjB`#bn5cjYAc$N:1r9J(P3&0B`erd+crEY&!EV>JgYDp>;01>PoB/=/pHS9T5kGjYoHuut - 2ad4-7.^,6PlOeUEF=P\8Foe%LRC8EYZkY*99^MeFQZEkpJ:Ge;"YVgJtGr-&Yjmf<45R$E - hu]A/W=P,,39mJF&uPZNs'MMQ!PNB_ - Id,p8;[![qk]XD"cItp?->epM]bf?fN80j?WtTDfbMHHZr;*pL%TWG>"7rE-IXopSW?3[sR - kiBt@D3)&GCBRn.[6:@ImPn,U@;(BO4/KY7=i='m`Uh_X"7Km8f-FpPO"*a@KN.#^0,!O%N - 8a,dq'4m!nBq'V@$2j=&-PkeCGq.H#hGF/,\R/*):q*8D7Y\VE - #$7PpVka)YV#"/hqIc]$5B2qm?\:ACm8&8i+'3Kk:j=oMhd;6:oBC;logfNpi:gL2#D_edZ - hj^0[dT*3?]3pgs4?K-&/.;TBK,!+:)4,;qrb]jpV6V2_#,"br$TAZ2oGP``;E]UquD!>EK - 1eVT81oFL[R)*pWLO+IDVq171$b[XO$5J+\RJD3n - E&BA9l`L0F>,@X[6Qn(`?pa-_709T]*V)V:P$X]O#MX]B/bb,H3UO$HdA^Qq\(M@+`,"_]3%),P"LoUUr*$H=g - 9i['"MqT,VH/qE/AS0;g&[:>3*6[B$LGlulSrVUo[oghq=6LK=(j^I<*7HnetE9?.#<\O@Q - K#Fr'_3''r,T2eD53d+&bYbu]-#DBtQYkX/QGN\UEI9s[$\)$NJH0>\E&r)3^UCaC*.StI% - _Q[hairQ1&al':g.d8.\N%50EZ%,Iq>-j-f8K,"'MeUiG6]gXt&&]%g71mIpUB899X?.%)] - Bj;SaKfW_/s%k:UGcSfUoQ[81a01p"3%2`:(+HR4'"F#V))Fm`3O3M-d!'\V"?UD;gr"3,Z - BFL\=m/ZK/l42QmfM`$_UV57g#^U3tB`Lmn;k0&qpQ=@*jZB#_A"m*qGj"5L:)R"[ULsqr[ - ahn&tG(^Zp->WR/!D%0SsnA/tqB:o#ZO6WB%.:Xg*g78_Qk4AMhD.V)U6TWE*?a:%?s*m,; - CZ/!PZ9]J7^1ef71+iprOP9n_e/WF8n(.rWtb4+8"sO;6XHdV@dSYUiEkbd8rp@blIk(etg"iKmP>_ - CqH_Tc#DQU6'gT - u=G+O3o]m6"0Ck#nJD)GZQo[Ps-3H,!F]rHjU0%3_T,2s_3-_70muJ\noJ1P>!40$U`i)bN - t_eLX0;B]@EnB,Ob?V/mVXETMNi=7&IK,\5>8e\UaF/f0jI)2,Pg=uiD#RnXd;7@dX`jh5V - 5RL@(r]T_*p_fQn07FBq;FVB'cQ`uqZ;e_d,/3dpRUc$-uG?2E_-04o*.CGTSo5SP - "#eAGZmDWW-2fUW]2,S"9[7CXQ9NniJaFa7i[k:u_*hbk\K=DqLo7Tdn'?L*JP%tu`%26>k - q$^>:a?1oJo1q=Uck&\_?1WS/H+4k$d;,'VO[9$QT#jb#Yc$bh:21m<%`n<\YcCbPh2*p.$$ - L4[hk^bhh-ti@SkcA8'T9?K^l<^3QIr0[&XJA=2 - P!GFS#VR6o.:Keh0')\/U&oK;CfXiOUr1f3+Q8-O>McK&Y<2[,SbVXM - j4!P!26OAZ.W6IS%#:2Ap-qHK%4!H@H*:(/UWlu+7&jN,,ICWM:!#a]Wgr"B[I2%:dS!X$> - d99mXuF5]is[6HFfa*,?:VUJBC,g/Xn1sI`$p7C-le5>dQW?<)dR7(M#=\KlIlc,Cd"o;27 - HWShHS`_DsdeF\5s0uN>mg*/jOWk5q;!tbFKt2!u\=2El(fN1FSpOhkQBk0"#+Puer45>FAmI;3@cJi28m="HBp)^^14qF.\54ARO^fPja?rH6&iWT4Ach8O - +K!`:e4T^Hs(+%=d%>F;f4MV'cGN$rkLW7=W)7YW6@U)WanO=tH=K`KLgg,j.L+K+iD^//u&uYg,h9(P5aaR:TId[:-BUY$<4dIL@pH:Wl&M/dZp<0 - (T9%bZTu^AmE>21IF2Bq5l.$JaJW,L2eOW,%BKAGJ`5neR;X8S?rKO,Ur5&BMk=o`Q - j=N!g*Y"h&W9_L69nf:J,>,/Yrk(@admb/-B:TAPDVo - M(_+7!0J#BejE!Os+Na7F&_d>P8!Y1BYcSI;knXs%>T0!i\]f.#9>=G-ZUGliE\%JS4>ht6 - A\!m9?X.0?_*!q7Dk^g7/J3:ELue)2FM.B - LRm`8IYai9LgT:=-6sNrQ=gHV^*C9k:Q/g8o#F80f;YOEBMj5mO&_#N0;%0JNiPM$U>F![K - &[i(!X[1'-m7p$e@I!0[:GnGRo7rQnmZ.R_taL]Y0].d@S9T]ag - -ua-781V^bN[UIAdS'%2!tddkTR@Mb`XIu(&+NL30i\s-n-\\j#]X6P`)]W0UAZarrN&@!Z - #lLT\D&Yhk=kO2OM[EE/JiDcQgi<1,U>\YqUa,"$K\ef@3?4\W>`%D)Y('O0sqs?\Jqfe)P - IHW,jYhWaTFp)&ShHtMl>.P;PPIuUN%Rsn`4Ht/k*$#ibQctY3\gL^Bm/T+7;N)OJkZ(^EB - fk+S$*`!ZeuZ6j - ?6H*U,-!cP+(aCT'Z&_&i4An<.mk#!]77gmW8g(Y\p;ZFH6ejX[CK%ZlV)H,=5co$<$O`oS - 6(P7m$/jrmXL='+54J;+m.tD%p+^<*TE&?n:j+4sId?#QmP-R@0f[bm2bC$rVBa\i[3%_/ - FZVE3,4mTk25FZg0dFdf,RT#!(Lj42>O - rq9J7V1n,=Zci4Z%(7Q.\@<3ko+gd,CKd+T5kgJ-s`A"k$Oc2J"1bH"O@>fO5U4Q?4'hH", - ?P0/G'uUi+jo3BD]V2'AAM/Q.&aUs$nqU,R\E1'1bahLbPZ6&2t2@ - 2\ZWq&e,urETE9PlolDTj)Ulq*]Gf7+f#lt3(G6TEHa]g5iHfn*H[uZFRj1\@Fo8CJO('WX - YgkQFp&<)X'i<<6FP!>2_B5aVen9,D0@,L[68`#Le61\@obU"e]VJ1ec/5W\/Mfh=`ks5'X`?k(dqGR0MZeZ<[DV8)hOkGGkBZg[Dc,C%,@Q=c.B!P(t"FS3l"&Z_g(I]GPdGH)37kq7\ojA1G - =7MQWUbsCK6R6[&8)5$&_l'@/"`(R7&tN_aJahgXmluGt4-/rJao:NL,ukf:$Qbq0FQdA=6 - Se,tgMT>AFqDP847ape,3>*@l[sBLK=:AW(e%_Tj+Nh - sS)ja=R&,tt?We8!JCul>3K8s-_4@=(R;tMjGf`(Pa.:oM-Q/n/2XuFnop^+nS$QInq?033 - `KI!Y?dofu'H*9?&U)\N@2@%ZH6ah_iEH'=Po.]5)CM:h>G!h@H!!4TQpI%)TLH>dQPql\, - N5<$]8CmW6$/lqQGJ,46(%LKVW(IIW?kae1S20tVrBq9fr_%fZ\0b\Rug:'>(NY_c_Zn`T_ - /tA(:SHjAXJp#Mj>$UR^=;cFHS\1Ss7F!HGh"rKpEWD4TW0s/XdFfj:HK=-%Hr;3p!Mjl)m - 9oY4IGXi@1s@&Y%LpYN#7ICh=CKfFMI&&Gk^t3o^[S?jLXL%H0CS+d93VT8NKGSQN@!GBL, - .a/c0OX8/BcgGu2NbCc294SXLJ0,dkZG@mLn$!UiH4(L&=N@a$N:KpW%HZUmH8ZcD3\+8_j - ^h^H,A[noB9;&8p,77"#;/eNOSJd3h)*b/?,I_ucZcN6T'ZkbBXee*PReq+a=!r^RmLs,k9 - Po3k44V#c,Rb:%&:mco/4LMemN,TE^>e7V+hAI/q6+3UZ0jokHj%Ilnjd+)_"uZ=@AprWo= - =W,VKs86=kUP.J\)3f]2c6aHmtdo^Sle7*;i&t>6YYo84RQ_`;EKO+Q^RN-,m>Q(1q]Mgc* - 5^IC1nD5-bq8"_#A4Gi(cka7@@`,k02)F#9C)_:d;$\_!lEBqp&,O5)I!Ho9$Vh8?es4X@( - >*++(gO:PD3bP]3#+UcM(lY9?iADF0/,&MZ'-5ea;'r2RXgr%EU&e3X`^u6&#/5:tP]m@>R - \ic7a3[(hWeY$0=O1_6>SI;)qXd]FBPM.+C4bKDU%ZL?"Q!O-S*?2X9F+:A8-D[iLG)>1,)<%8piT(P_:1>3tS1;u - A:RCs$=0>7N+2:/FB7[K1?:E2,YB=(8E'8X)!cl1ph7f_%9"[D/pTNF^a0e&)nb4Dd+j`SX - qpcl:_4@'YIKCkL%<+Do6XF910-AN35A-QU)dE!tKW7;Uq;jbhj_OomR/H07`Gk&"EP'Q6X^dhIGg@C0$qfo)CH95;DVbN#F>kBKZ2BbVh`C-87A9c(t%$N(lcQBL` - "`LDY)nh7M:F0A$>?OMpoZhZ'uIT@+mbF&l.d_3Kj&onM@PjHccY50br0pqqSunY0;F)#`q - $q8$Ek:IK,UJVWoN.Jm.Cl1_B2X>fi]q:ko&-?fQAUoWX1"8BfXL=fTGAG(d@k"0%bEdl4_ - 3;o!jC&-c`+:gFFQ3c)p18,)s;VDutLI9ZJ(-G<\n@`F`Zs;`c"S$eQI%FrKU`-FJtKS<*g;XNI0dOZWk/1GH[J3pHJQg\*NqU - ;>G5Q5Fo]@.b'+h7O/%B5\Q!p=hs-@&m.G2e/Df4lKOu#)b;-pkFG/chKhP,CZp7+0a'iU6 - uaJEU:EeQgD)qlM1l`]Ob9r@XefH))\g]97ib(<9H%2$n=2+Y88iM?p`FKD4K9I.@uPQ#14 - fpMR?F?e@_/E6Hs4^5PK$Xi'*3kC):KdSC`IL`noVQXF-.W<&!TJ/c>^nM4$=qVqVY.diMA - aXF90KL77V0]HHB#>8sLEsM0[0tpd^8C7 - 207=IWi?*O]GQA>+&sshBK - 0X#:\75DYItl%/ms3fk[r.p]2-sqIBQ*4Sn*1Z8VT&Y!u&R=LjPB*'3HrX?G:kO - Ujh-/1tc;k"k"=];5bt9`F+>oB?$].1uS:;n@NeLrk)*A8jeRcN7=^m!UN2#=/&,8J3NEC1 - BC.Z11@0T[8FGJcZGfW'D@H&8m/Y@+DJi<6rjJ?#Qd_XIQS\qVdTR:C!E.1"B/KU!lLfn8L - `#8:]F4WS`!#=PXErp76soKQ"!T#cZu$93bqgEQV;&.@2;<,(*UQO`iBHp`/Hs;kI(8KipG - oD!=FM?tR]`?TQ!>Y[)K*=H:J@R(1fjA(5jdOnD,Sd[=,p>AD1k$CHIW - pOlM0HD1<(LG7+&6KFUFP'.p0oErHiS4ZAm]gF&CKSPVO7ldWhY)V[S!8_Ii1ZB`c8NCcCA - ]+X65"HIaq[aOdA'.kb)#T9kAK2gS5o5lc_pcKZBd$ - eMpOCo_9/r!Tq*F^;r$4(9G-GD+1[p'V_CFe - EUK/P!n0Q+=[=\d%R5b!;m`(&5g5 - nmfN]O&/d0$i=hS:g^A2KPb/jh:rN_9-M*=R:qPa[aRXfc/3jrT&YTYYQIrt2&GM4^.;/4- - iYqEMeW+JT^A-9DUiSM;:HJiT9btfAd+O5,YX$9\%jOfq^Kb+:)f-`N7A$s:E\7qL6cV'uR - e3-`Z>)..iSQ9l]YRVMe3(&oIdf*1'O,3a"^t0G,-U^X(f(#:*V(sPm1` - >84aBeT*?EnoY0(Lm>n08ED+&3gFTt/`rKPSf_ARi)Vqn#]*<,gb'E:m?% - tE*ZSbsQ0gR86D\ - $"@V%[h^!*gRjr\p2m5q![<3#Y(R,sbag'QRt8nW^Kp.2,Rs$1T7"Gm]Y%$FMmXYsWfM373 - ;I+[IM)1'2ik3@lq"1D$OQZ_Qm#j,c(Gi$cMP_Q57S\>6i"1:/MeY/3#udZd)6P!41OZuY[ - cME;iS0gf2(6YMNEg7Gk_6TQCN0=*nWGr6/#s/XP-QdAC,JuJgq5s'$0'XU.-b;(jB4.9tM - 5`iVm=UU'I)$f]4);tn1Ob=A;UTKH-'SFqeA&s5rd&W"tSnS.g=p'N^$5-l.7;3Di^r7Iql - 'OaS/%QffGgM\[82:kSTb'7D3'jl9m[G'MU/Fqs*(c0)-PO@<($U^TU.W1ie$jQ=^gi+N]O - )+Nn//`6'>^7M6mk1:-mGDH,-p;S_WF1\=%?M=5&;f'ZnA^J0Ks#j_]nS;4%R7gG/rBe3Rg - #6,G?/'U:V@/W]<-T>>r,u?Q(s('Q\AJ`/$2`"#22]`UH&^\pTc:&.j_3ZD&3I\:G,4hNll - H2K>UZ>,hWdPmo`E4aP1!@>#phN[/+jr(4Bn3N>?%W_i#H8a)CXe@dsXJ[6O%!&$tRMhC#/_#WDR'7C;J6UqOM`u@.]1 - HicOP"EU'9<1\*H^6io6q?$Z6Sh8#9(P]__+Yd>8,E!JS+"EC58pkV%I&N_l=q5_VQ^(k.[ - 5f?PL?k33#,ZoKA#]3#lg!cGKPa;#h[ahM=A+@kFRR@K1slb44^fi)jQm8-,CWSd-.sdQkp - =rbTu'QZ=b:O7@@9r2KE+Ob&G9sb_(;dT%qPtTiI=sVjQ^!&)?#tm*\TW6UaX^0R:+,Er[\ - QW]`<^:Fqb448HNM?PVf3T,BKqH$IMBlUu4SNr;9@5_b7p#3G^@ZI!/0KRP]BU6UR?M - Pl4EQ"Xr`T6^%7=9KP'+6Q[<9XhhH7GgE5&VS#"Cb8`r9HQY7>W?o>Yd48.U,gh[KdYQZfL - N4W&`=dkcV^m\RNCYPH\Outb*As!QV;bkoM3j6J%&GrX:gG:Q0d;^Y#`M1hV<&,]RhQt(a; - ([J,eBs2,BV7.nCW]j;XReOeJP8XN`nUL]YKC`^ - .3bp)MXTPZV"%^eK6?&NA/.^I_O+DP[aGc4jrMMBTQaqK<@LtJf0bgu!0H_dZHScU68.Ko' - )X5/#Kh#07OJ&"--SuARB[9l4nd;Gf'cQAQdO[9)du_U3Ok*Na.Cm-T)Uo"KEXjf3P>RnuI> - B";SeFsY&ANiUEM;r=1I>h+@?[b'I)Jt - ZJt9)KrDCK&*tF,<(PrQtGl;S$[!gcK$QX^od/Yl>O - k)L[#*bjfB60P0(U:2Q>Sp8T*m8Cs;GWdJ*R+XoqB\BFWr1=l/OG_j260=R"?OZa(5Vos%` - RGTU;Pp]:,o'mU;`KQOS\WL#6BsaTNJcGt"P@hOph=[ZL*Y0aNd)YWDjAOG - XCC1('ii.3"ZQe"HWFG_%2._7/onR^"ap;M,UDrjr?s)P,oP,Hr@Tl4(XZ)/nk-Aa\UjH$5Vj)dT\c-BWt;jp3sErl)6p6i+$fm]RN,^8/,4[u0bnJGV - QsSBQ5Z)u2rVZ6_\LnKKIP*9*FkNiS*;dD^tt6Z/.=fGLhj/j"0S52#EUPi&8;3MG_VVWL5 - \E`T*fWMkr]NV652+OBoSNP*u4(sA9a!RR"Ak:-;T_uhk^9O1qm - >>2rECGcl@F,"7"pD?"M[4?mNZDUr>.S^71OUOl4d5)J_6N)@SuI&bBWMXK[[b7%NsoDaQ3qu,TMX - &`Ng5M-d%N?pC&M5A`9U$'V8A6OlJ3&*m/`..N\[&/[c5O80\&r8kd@C1:Qm5FQ@*8\(42S - S*bV&5\9kGu.fV\uq1l'.,m.hIO#VKo?*Y#^GMcSQUne0K - <9"eat?Q=[0dg*Hl9L:h:JNOLEYR-=[]($PuYPaZsIf;&QN3EEEe+W*OYkr-4JYi_#".hSL^'Z1VCEaTNb - $'"0f)JfL:O<2&J&XAkT'h]mZ\@WEk=VBFq/%G#'BqLCMK.G?DeK%utG3i!Q*C)Aq#]3UKg - ih_+5$/lXmjZDD-HqQt?oKZQ+OYYM3_IR69!!Ud-d$3GM\I?+_lSL.WcDhnBeM/c.m!l5PU - %0(5pE%%YS+l*HBsXEUOuhru2oGK+9%3RGc@"H5;^:"7J/q%*lRNp:jS - (^^(PSP/-O`ZpbE![[N>XU/9^?62kJUe,dK`gA9I%@bh_E=d(#6P4N=&kj=N'h'+l]Y^*"/ - >IiofQqgmN(>5:"D$?,LK+bGLNEen,6ZSc6-JeH5R+c=&pbPP;&p0Vl^j2Z;_$Z2IYZFC"W - a`T&k7!(p;'-[//%XB\\13J%N]0S.5lpM3o$\3mj9L6&'2g,8d/Auc+XMe@nfWN2Gg71d+p - Z]N.CSbB[(18`AJT8P&=VE9lD>`__]Rn=6rLN-q^s@rs:ER_&6h55[nLQ - a&H't7eTp92MEbD8*eroTDNETRV"L6JqfU?Ou)erbI8[+C5H&[9['gB#M*k"Rn=3KBFnKqF - 0]YDfUI0hVB%,nb&CAsSX)#3!KGjg]YSWr9&PG@= - ]XFf$H,M_np7=RhtNUQ[Ut;-A$2AVlnlXu"6A!in_adU1MX"cE%RaOW3@d^H11A=)!k2T:Z - klZ?(^*d>`o!uHXUi`l35IRbcNbN>"e^%9aFP3MtFa_=r7Fe!*MQU>R44mcoGG9]LF^pnerk9+Oq:(lmP*8_Yc)0_ - bZqk35a'N/I<`$)>b&K;&]^T),XWae1Ti31Dm/\B`f97dCBc-Z"/,7*g@94;]r_M=d6gn7p - M.(a\IMW-DsRk?G2B91oLdS^s'#.b>#51b`rCN_'_oT*6Bt[dlc#7bu7ehGg48;igd6+c,,[SgfQU,(;6T$fc[q5\&FI+Rh*3V%k[''n')(AQ - `>BQK?eK@-:lM<+gNk=-_`g4&>FtR-2Uqid%\=b6&Qa,[@/dbL]mL,A8G'T`>ld`WRQ%_7m - -%CJVB$5Y%Wd@BdQoH:mNsbqlVedHtA(Bl2+7VV)a=r;o.=U'C*b)mabhj92;k\d-]!4reo$8O(B.QFOHQCmTS<,-+K=Z#_WS0#%Y!1a5NqP@Q - [jp45`loce( - Xp4YWP*8'fmW]15m&[D@A(i\rh`[*HHd0#=2inGCsu`GKjM7Kt(+>)tDKA_k_WH'hGn8N`\-/,e*aA_ - 'E@sX%s'm3j>t_E.0'2$(Q_@Yjj^EP$#c9B;UUGMXc/&K2obQTKI?2eT5Y)ar+QOf%OO>1< - 8=:285m3/OP!/UEkp3J8PY)MtfsqOU2#p,s.?(Q]:eDTo.*HZf.j]#7Q1Ddob:.'U,ed/9- - A'Uu.r?EJHhj;,=5+R42p]50\l/,R)CP:LmSf&*OC2[k*[?LQH&\qo5$_>q7/U"2" - t8e@gM[SNIW"3fdgp4]e1eCu%FZrIkMt8Hn4[oE6 - [OG/o0TRUj'&7BI"rl7#O'_,_rkP"cAG?JSoV.(@TG%U9h."n!KI\C('WglN\"mU-R9f.uPp]9@ - @)V:>W+7d+,3-[+o3'EYamiW4!QGehkk\0,fEaP56kmq(kh!-\--TJq,2_sY-E:+b:;Z#_O - f>J%@l$Jl`dGsKpC]eVG?;cft6"$R03W9kD:<#o1u4J&r_?OUA51i]?G]OnIF(:/j"(g5Xt - /U2+geojb>74\fYLN#>GVbD6';P\@9R5p3Tp7Q*W6h?>ou(mF:A7W1>!TQa)7RZ`_`` - 2-Uqb7pLELm`Glg!9k=[3_]0MO`c3<@WdK'Z[@fXRSQ"Wqr_V/+Op=nERBu9Mq>OUnO?sH6 - >7Y[>Zh[VE`<7TYmR]BnRO]@nUR%Z).\+:@o4)c1pWDK01atQ8qfC.G8DoCp&FI!l8\egc+ - GJNScNg)t#E-1'/6o_^JR9dsNBmSR`)8V(Vu0_d$8NLT]Y5RS/WgnBj<"SPD=8W1b+'56p9 - J%*S@sRm1S'*McUa:)$7FN+TH7:n^b@Hsf`FE]8O&_e5RN&2-9@cUc5TRN1 - O?&f1%B3FodpQN?KI/D-1`h4dMJ"COJG(tk/&U_o"*ubFe!D#LbsUi34$j'-[k$[oKTHqlDBO@7Gi[.gfR3Y]_)+n!G='#JH]CCOff?\pmB9RbF - ,#I\I5%LK+Q5f;o)AFqFN+)Pq@[/m0mZV<1EX9?g$P6%QJYE46kXhET(GgcL;.lSk):adl& - _JBrV"<)ng\<@n&K>tm(1=-`,D5]mg@T/LI2-CTNL5/H/7B+.G&KgFAP]ZAf9MYH!+7:VKQ - Si7#Y;c+](f+D;+>d6YNS#8(off980rJH3IMb0kG5JW1WT(B^Hn.snF9N>)DK3@:;HA-U:` - BW`SbrE5qMfMC/GClZ"C]$oX"I,AC/o0NS:9#B1&-hmH:mkmJP)fT,aXmCa:*hG>;Y`b7@mG#@9=jRAoWMcS_M\JMAP@j%$6P$ - SECXPRKoAI_^1cU$:SbLPB2H`%.,m[sZm`6>b=IQ79Fn1#N,WZRN]rFQ?K=agjG;U"Lu>_Y - IT6aQgBQ`6jb-OmqULC$$Yi^k9jhAEK+c*Z#N0k@:@b9Y[-qg\'EF"u`O->oJu5eFGD%r"c - n=eo\uXc=>6MHOXU>o,CDO_jG77lW9SUTd^B;N$mr:tg0ed"^32L?c$F(`hb._'`G\a(eH, - U,4ar2%mR+hh"PD[Z_d.J??],SVcnnCqkWDijeEg<=BB8L%9ieI(/<(*[$/P7?D0H*Gnl@N - J;,qiA-Kpp.;PXf;h@n3C[`WVHXUlrs%FMoH!-pF@NLcWHOC/>g:$8.Kqge(),:8Akb6ACA - 2FN3JX2@7NVW",Tb5Xo8o4A7*(dC1-:>6_@e*QW'Q-";Z9%YAL<0kQ_WDr;[Ge;)%56k!Ir - .D!?gcDO+8+_iWT`4S3*'K-2,Ysf@@K@G"eWfkOLG=;:(BF[Rh?A`@QFUVMNi6rAL?us:DY - (Q()`\eVD\F4=\#HWY^7ne)&;'j)+"_=L/a53d#k,D0f)\VTn;[5"/O=a"J*!^".-H9uD^/ - /Ps;X@f26jPj&&6/m1h'1AF8-4Rf%Tl0U'0pfXNqTA=5VOTn$Xr[-$T]U\>Y,'W8;"iB#Ae - \*NnbniG7,E0MB[cDhAQ[(>;52tMb8p9:5hKL0W%h\JKg(Mra'RG[UC)_V=Z.s<6Ye)D?Ht - f.AE;*>Yf5SeV2eO0CT?CHH7cm;cCbDVDMdOlOjlP;b$Be-/@Hk35u0tP0Zsm@n_"WWB\l3 - )MO,8j?SNrD&)62Y)`TI;3:qF!m#aIVF'*4k)C.%nr9sAL$3CKTY$cPqsLijb*lN*kJ:Ll`d6;oTDb[2`/)Mth>MKGal"\?fa($BOOk/ - L7h1p[B[[jZbh7o4-F-I[XY($>:ra22^&cmWLXc"1?M_lRB[$M;5a606mG#Ac(A'_/P;:(/ - p*#]*KFK-l4/JENFuA$h[UEq)cMXQ38A7r4plLf`)e8C:bEV/SL#Qt4-)8B57<6e"l,?:5* - _DQ7eOLR^40E`oFEgB1,FEKKGSU^%#^Y))M/b9/HP\p)T\m7_hQUJ0DLdnV(d0/-T`OC'Zf - @S?3'@$\-78tSND;T(4@o.eV1eSe2qN/!,3El:j0,eQ3/\k`Q-D3T?RLibNX,XCLP=-cSk - NYsB\VIN%I6j8OD.%Z;0&;2>HA7J<$DbsP(p5\N"49u9_1gDF1e?]F.L_6T7ATZDAWhlA(F - 9Us&Jk@p,D/4>jP_E+4KTpl,cLFGU,c!\PVb041/PkZ/BI&ONM5"Ma/g4d&(%#,+QLn\h8t - 7)4k^67fYXB"!J0>gme+0\VU+dijjTCuZOQBiuLCUYK - %eGa2,Fr5hrF$A3@8R1h;$f:8TZmXLD3W15p#L[@3.%KHNobM4WX*:u[.OQF7X.sj7>+-K: - i#0KDoCpma?GfG",#TTd - *e%FMD(tW2PEJn1rge:W]ln?5W_YE=A?Y#!_S7ON*5@\Z^*eH)M]MPjE@2R\rQLVTS,Qea22\LI"P*AYih"Hqa\#Kq2fU:C[oQcCeF;=eKq^iF[qDH - 3bfY51c>QjDF@f4%E!*Q#Fk/s1Ep1F_oP'_:dF2[b,?X`Be6O8PfG"Vc"T1kKD9Q,nC*/4@ - q3$3MKO6$&pu*T?TSgDe^,Xs=Mfi(C.A+_f(>Uh4R-_-^/-t27f8u@TH[@CaSBS'c$DFW8l@plQ8Eb\(`E[>]@M!fS.0-]CC)MgRj10>n/bd.G. - =N_\Yl3KJiG#nm^5j-!TLc%iZY;bt23&k[5&FBuAOi]q\X=I_8()MdM)i15[XR64Hb]5QG, - #8E'H`6BaAU$;[*-B*J5K"g08&AeTPb[;_CSe8VAM-ari#1W_I*drsQ-`N$/;%,H.gQW.`G - epKlJ[EmTS^&O81^KP9ZH:`A3.XSC/Loe!_Sn.7PH>,74U&__lRtg*Pf*Y>6p>[6gW?Xl;%Q - J[jYV70Y+iC'_C_q;+F;MB^VNG\?=,/IETMB#q/W^la0rej8tYp)e7VJPcX+/BPaD-e-&%T - 5a')=n6,_%a-K$1nuX7n@80^qo7bE@\9Q&KIU%f+c(3oZlgDZ^c" - \IAM3f!2\aRFQA:o9WK.d2`mUU-S4[W'IWL&o)&E`PBV-d>7u"V`5YE)P - l1=@@=Jp66\R*hkG%=n@&$$V,s&!J`Q:d,+1=SJ+$;a^LX^g5;bkMC+jg`,rtS:hR@8WOc/ - i+>2^(LWUrrj;bWZ'PWXI:j2LE&PA]C]$s)*`pg>r?"G>rY"f7MK$gMR`kIj)@'XNhTS82c - .5\nq?7edtI,*EK?g%E?T@rj:[<,W\h6,YuNIaCrpjkJ6NJKA3&@R9A@>T5L1*D.)*MS;0Z - 'I(oN@,s/M"=A,mu]`.Nla)G:uITsV2\W"JYpe^1T$,AZR0Y8SP5Ic#/'oD6"eR)bCpBG(J - -YcbV\$nJtQJM<6NfjX^*/SBhlj_ - 9Q1\X1m+\"4ZRp=1<:83se9:cs_*%53gf#:7pW6'Kem-dE4p^D!FPYbS5@)1[TXNS1fn2f2 - M4HFQ]6YD[@GP]l)bj+N]m?RO,Q=2hac#[bW7:*4;XiQD.3r%l!Z7"S<,a+d/OS>_n816Nh`+635i'W+@[(X;2#c)Z#[k67PU-?)DXm(WsYSRY`0\*dI - 8q7#r3(^,"4pg*?*$T<0nq'Z?2]e8huX/.S@"RBTsL]]I$_nZLIN@5SF^c_N#3^jYSDrUc: - T$;foZEPS90\3YZY@*)"6Vd/c*uYk[WN:a@Ut'G>LEN*]@1iQ4PY%*HU,)mNh*!Yk/m9`$d - p+X'T51,3Q@(pt%4C)h@Q'e?Pgif6jR_A-A`<\*Ar-J#5bqGpZLWOZ![[Io!nSe_oj@Oi^] - S/GHP'p]WgU@"OAg,)BGP9#dZlYJU>gWj6^V5:n'>VtC_2@[,Or;05%j2UDTm]"uahBtbT# - !41@D_>3=B[_D9\*ub8IAiZ/iRV'+4X(gHlGe7RA[TE]DL.ZTI?tct\iL=O4lWK"O$Q^ - *_*,J6*3tuQ-*B$^b/jcKF);FN>P/X$4o@g+6cNRcjNfK5BpNpLqg:)piF`+@AlKm,AF\)Z - PQ-!/r&oL86r!YoA%Oc<@QPM&jU9>UgnhUtW,?.,]`QW/]SkaiJD.;(4oJZMZX,UCBr$(>J - 7orit+J9J%!^2Wrg,PjI4kr'[CDWgk^%[$7GV#Uh`TbGZ(O;PUQ^7DEYe_VK^^-OFg(m%ga+!6F_:O@Iud?&I'BsAh#P[13=7J>n[g#b5HrS+^fl(.7(m=+!S" - Z:oYEG.s/pR_]/^bc9s1e7g@MmOJ"V.a^PYlcseEQ""!Y - ViCDQee5/d=[uK7_-%T)C(jUZIogV"8M^"#)V-[b=\CJ^/HqrEg"mO2:fS922nAcTVgFp+IX]tT]0A[l%fa[1HQ0^-8`a*2(cujSfb%*M4 - hoCm\D%5&N>]o`$$6=Jc+:R5;=VV]nD4)"X&*Xb+Q/*;OA9c&>f/VF"\-(bhohR\^&-R&iQ7 - #c\OL#6X7j#:MC>GE_Hss?,'\I/2sKEbB23 - c8oB(1PZ^/+jsY/%mL5'hC'\1E.(RL&/Q.%niFFOa=iXSYdf'Kk";KD,%")^)#Eajf6dgl3 - p#1f"5-rd^PnX)#4MIGABe0%#$Q]Ur(OsNhM+]L61+/6_Y$+XnBH=(C&hKetV&=>mOhsm&* - 7k#mV%tJ!KQpKJ0#(F\rMiZ6;!j"RETcK-]5Sb#J-Ne($H_CC`4#AHs0:F=-Hs[m.f52C?J - 9Kh/?uFFg>(676:D]8*b.-6%Ip\u71u-o;2P@rB^'7`D74Jb7k@MO7 - ICh&U55ZlclALf2^&W#"_BfqQ#a<71UF`#:DS2]B;3M>_FAoKXK[k&q#"ReUp7RreDFb0B2 - /gPI3G9tBU%$\Y(F@1*la71B\e%XN(1SG3\oE]4&K'k-J"*d:tTb3C/=$G_5hqHL+a-W-4_ - IF;5P:nkjf!WEhlTsILfp?,YgUP!:Llp4&t`# - Z(S919'Glge^f>3]n9URp)5j.!DmG\$ehfp9Z+3A?KVrYj/[e0Jr?.mmMMe+b"QCCkM/bFY] - q\hF:Mk9B"c!Hj'E!5H$]R,=&N,?O(.`3$83j&NSJ)Sj\'BiH<`CFtHCdfM1GiY85rQT9?j - %AVd_3HENOVb+CJes`B)`;K!/Xen"-JJn\]G6l`@_?'(c#?nZlC;;_X8,%`0hN(VP6a'l_C - k5+`Z3`Ukqn_X,Ul_'UF.S`7CsU6/0Kq7)rsP+f7%#SH3`]AttucEN[d1Z+*9`'-1mW#C^, - jI7M6Ti7Cj?Y/iE"H+uB&I.C.X=`Seh\a!*s,=YdAI*\7V=CTuuAR4WU_UrVJ]W=Ll8B=k0 - 3]?i6(omthj6LFH9rMkS]5;rZ0^ZKOnJZNb'?LEtCrUU#Sp'(L)ujJnm2q!sZkXX-2s3W'; - s5ITq`>(UU_Wm?SZD%Uk,RT.XST-brDAo_/Uk4]Q<)MSAZ2btRP_@m^SsQMR]C]Y>#H0A[6 - =nPN*Gbb,**RdKptrMP0,]iiCTRX8uS5B5*=VSnQ$i$7?+hES!hMGEkE_r6"'NL!W%KBC,V(SS(gHkLPCkh](q[Bo4SqDtoIq]c^P,4RN - 5\NDHJAVF&FWXtnjR\:FrPR[IQ-$kB2gQaK;$`GhS/$XF\(sA:L;E'_XT]5>?@^lmc^oTkm - &9.go9El>LV7L>"\p?f1UT#!G"-qpp-TeCjcnN&j9`]#9V!2VU&K.'8":Rir,!p+8$hC5^4 - f72RS,(5PEf?B4j,"?2RYaouaV5q?oR\;fJG:8+`#C4g8e6J(NJ%NE47A/;\[D8Y,rl=<6s - Z/-$^5!n-o+_[8Tr$oBuZr`ZEqoDM4MBS5f_N - aN/=,NfaQs>KIqImsSc4!l^$OP'A6+WDf#7ikc84!I#;.<()DQC$?,B;e7dEN95U8XM^O7FVQC - NC8LOslb,P>[\d8V&o(&M-9HYO%OJ@$`$V*On]Z\69i]Bd:Jo\4bnsbOLuFEqUF[-Ec8S6c - /:P6+-NW^L[R!L\=O"Dhp1o?p+l0YKMp]hJMa)2G07U^7XDNeuh`Be5Fh"s5jLS - C"OJoR75_>po5M8,6s?;7IRTYGWhJd;`)%WJ[9=\/SD>^@[;]nB)+VUQ11X%q01kgA+13V? - #\?23:S@TZ0eS-+K,":m->G8Y_TR$^[9)d)_F_@-F)2"[u8>1`4W\,M.p3j,46K%]T&_b&Y - mH(X\(/(MRWQ3a7SpKT?uXQ+AXMFZb6R4fjJO^FUu]6#i)fe:PkG*EX!WNC9Z'"-'lYdU:- - _&f8`kgql,/#/s*^`D"e.ba$lpKt1\ZZ5=a:mkH!gVnr(kM0i*^H'YFeOE'(jSPL\#4=q3n - Rd'b_1$>PJQrJ%K-+NQG5tqmZ*7c;5!gtnZJlAMEka-]M-j0:.[+__lW'j6J3h/Z=fpU+dA - 'P_n7&3IN40Y$U)4,XBS*N2I+ajqj(R&o$+VPA,(p:`,KVc8r#spQ];Of1%!AB\SJUN$?d6 - FMM^6YlSN.Am6CAaZ;!]DL.fPj=sd+.O'Q5cAE*1pi;[` - QQ(jmE?,UIa6!4o)9@.kT[]njR.(_S/OU$X-L[ZFC"#S[$4a_I0H - oaSM+,A7nY - Ma.\k:n+ID,pCG[.LN9igEQi+!X^85Z+l.W?Asc'*745`&r<:b<2=:VPJLt"Z%SKIPbruO? - XU4h&@&1V>Ft?g#pm&2fR4WGh*Rolp]_,Wo471>odh=/T=u])B5'204@m?Z>LX'4l - bO'O;!ci2,?`!^9:rt7RHhjI*<`7_5#L!'[mRL=S35)pPc>qRYn^%8r8bb4fCZIPCeE"2;A - MC?'g!ujYg&A^eXqd7-`s)ePlcYot>&4sEtG%+LfZXkY2UmU52nELCX/^WL]nUT;8:l%Z.r^5)@U$X6nlc7P?ubo/UP+$D+a\SBNjYcgMO3bC091u(gUCL^AkB->W4Hq - @'Qik#%\hVf8Q>$[uK0$3$+e/^i,BKE^tEGSgS\LjpT>.mO3eOs^Z - ea6p%AXmgQW-s_*4K(QKefYs?L3O%tTc\(TkIsOnq1Oi=>.+L=1hc!U+YoJ>7\-mV\!$[Q< - nH_qUUC2(*$&N,mYVZEM5S:!2O&U1UnMJc`l]`bQs#*i8D2BmEf`RmQ.`+.3OLgebit,3c- - *'MUu#s%c=tKoc6KMS"AE)m(nO:gP2ooB_J]NK[_]6Z*O.hm@s\tHM4=p+-K5LBF<&-&DDS - '/Pc[_1_HN:B3/k+t_Lcd0=qMd\4ZQI3W%l&j@pfgGFbqIDn[BI#L:^e6]MNLUn\^55!]Mp - W2HjG(.\$1i]T_6tRdpD)dTMg^q*_+%4c47[6c,T+a;nMSIt<%R[=Qgp_>k1qYbaO/bmdD0 - k0rJd%a3`WF*?-f4nf=5Pa*EZ+LqGZIM;hJmh%k5Q/)*%(>oUBZ5#'\-Q8ZsWTU&8'+/aY, - LO;t),b5QQSV'p(ODSr3;XfXompGkZ>5U;R-<>2O,T&GLV5+%'>':@]T&ppV'8eIfnu8P+6 - dl6`'4(LWrlj:hXc!5Dsj1c#+nX^(mep=U-X2@&?1P-0-XjQ(a1UG$>pO2d3si,S1@NO,[( - `K*>]S<'UZh2Bo8Brfo3IsP`'Do@hKtpq%^G[\XB_#)"Wd@G2U,ApU>L.^E$lu*a_,RGJaT - "n^$P&NK[s[(^-!TP9_Z`Pe_sGp]$#`Tp3EFb9BE^&Ge%%_nZ:KNM2F?q":<](`IZ6=ulEg - 0d@>>GkO1"1i4Iim5!Ijr-gs&u8VNub,V^Pak+EYtg+O%)$'^ASW<&d2JFehQ^ - SisZ\PbRO"[Wa+aOK_P-+sorg4-%%\XVl:'D_S-=0R9XZ1RlpV]#+&2HcG@(/UuTP0!h;@$ - htaGd"sFP_ePRmeV(?RJ#.#GQ2%$pA`r,T%=JR&YTD!MUeB3TK(T%.r-K%),2o\X.0R=W%k - N_U0!Nj_O9-RE8_7FnH*\1KFi.anK>uAGjVkB,TIdDU1/!V)%*`ULCWQq)kO9ZYMA_nI5:c - lna9M-d]TFW\]S$,$qn8>K:kHl1_f5r0.bN\"QGO`2>0_'?kO&<"N6mC47::X-h(Uc%'tFQU6;p^e` - &+M*)FR(M1@/!C(K3e+0t08fbo`$<*3qRLAka4TY,+b$@WG_9Qm1Z`=eYh2H(5mf8Eo-.I) - ;O7kYGA,k)Ao-4)%Rt"Z<,P=B&phj(22T"';*WbFBUg - SQVFC-C3<^nB")'LfP4_32@e;GOYH2m>Hen8>JH&^;7nk\n_(t8l5Z>&+#b+35]fZT17)'_ - @5rFBa7Ok(4l9+]<;o#6ZD+R,qJ7YM$Ag;%7/TiQ3RQ@LpHO+'J$_`=)#og3$#K^2E%7;q* - mdP\IDLapZo1KmN+EmHOf - WC=`t?O<*QOeHHD]k#!PR038p+SS-XlNMU@COfYp>+1BE;D4cU&]VQXL<4lhuOTI::;lZeK- - f'q^Dg.)jNI3fS7'm/&)>DDJ\Ja!BRn=Q[.@/\T-(YQeP;l577OEd;%u8W6r.bap"XYd*@i - ,=Y_rHNI$?+u0VF6Xp7FGF9;sq/NQ%[h(J![YuR.uB!=M\sgk8DQeA(DJAM[1*i&S4WNV1+ - D*(7DQ^&1&2+WK8(^SAEgo#LPhg4r9M6f^)$G+%PI1`R#CqA=CeU>gH:Yo?62Iq>cu%V<$RM?c/Q\cJ'YsR - 60?_KVq#m_(/VMLI)PRP'ESmBKtI-hsCIGaf@%u&uhdKG6^aK>B&,tWrJm - jNFPO/:`;lW%@('f$i9/c1,i]SM;n&&\^#J2b[]I1e5botnS5c1ge)'>@7Q]g$O_H@O96rV - rMVW4#4^pDjeS&esl3c5cVoBFPe[ShX!."T.dlJs>i5+`dhA])YLH"Xkt3r7TWM'4,GS,:j - rgYlMqd#qI01/BC$`iIiq?:sDGE"h'$ggSJD5OD@57E6Xuj[r4Qa,!FkG$mIqoM*XHT/uL% - C@(d<[9#kgYD-3(qSE50SP"jqSojs&*P,(2:6n - jT=m\B8`;*7`(ke\DP*+#TbVpt.-_!-h60LV,J-gLp,V[V5g>#4'&bHO[Q,k)MOVRVqgMb7,tk3db7u"l%,j5*" - 6BJH.W;t4Pt`omfq^1dQRqqE*USM2YO<))g3W2fPQLFVpt+b\)u'P[$2G#kl]%a2('V1ZZ7/Rjbpkkk[Q>YPmOa6R<$t<59!#O]-<,HFXim8!ikg0E'#p96.>]#I`7PVmWliL$00 - eA%>R)IYg,%O[n[He5$a[>`=ADE]`nm4r1),DJ%R\D6>*E7^b=r#S>I1*?`@E_l6i@T2]=V - g\p>RK^g5r==E?[-1On>I@?>!r`HP:HoYk-rprkng4]@X^5Vqmhg?Tu.q.^L;(9B\$^ki*h - +#l3<`R"JFt8,6!IoG>9jEmMk..@#9G$F=+e581U>c]AWH3C=FtI"*4"a>0V>b>s=\Z87^= - C@Va4hAAo?E]@]daStL:GDp21O'J3mu[FW(EAK\'j\WQgFgR]6dFKYkM`p0(0Y)@=frg>>= - MJIsT%lZtO@BX*g<2M[%E00uRoe@R3G+;/KM9f,#Nbcpn0Rgq[%U`BAe#dq`TAr2:i#4526 - ECoFf=aUp;JN'i=9+Xbe2C2>NEWs*R%WNiRS[ni*-$D+an\FU6'V!TaB,%P=o\Q.fqL[/KH?eRn[@:/:p\N\Uk$Xf39N`);5^9ol+XL\DR\'"l-[q28:gc7dJYB$OFk=7`AHA6,][/[c-M+6R,A - C%270Sp^UR#;l%::W9hU;ASJd34NaE0^O@%0t'\.LgehMu"4(`MS"7/&F)VP.`Itm9_&Xeeu1"n$*Fmf[TL#;C9%Y,84:Wlo:_bHA-RDRTjiN"SuKD86cQEG;$0Ab*]i] - TPDIQ$qE?jL+%(S`-)LA@B.n_.iNud%1r%@Z)GnV,udfUjufT:B*g,"!_>iemWWGsCCb=9b - D`tBHO0imp`jbQDi3:bW"GohgZ)?69UOjN(oXtN3B1i&0qZ) - 3HJ.0dH#rI+sb]`N0:a?OLi^S+Sm\u=7+#3Den1mOr2P:29jrhO6JUn^op?SQXP6H&Gj2uB - M>9WP\+sUuHVJKVVe@dUJ,;M,$C(CQBm"C0gKa:Y3NjK`<3@+/lL(;(Tj;:^)^g'4]?ct,_ - V=$J6&p'npBS`Zd`5#ab"Lg_]0#I$M"pj_WI+U`.B$ucA"TCfHDKJ_;jC4('6OmVg6=aO`D - WmgQ"3Om4+EO@PK#fW;b:tQRbd.F;DWNH!#&IW+MH1*//]-!kV80qKm/i>_'2+)S$]=[ONn - Q(_,p]<$8QtnK[+g^>]#!#VdT71)E`StUMZUW\9C`<$/Hoc64_f:u%%pfV_DCF5LPU7W#(V - 9D2N1DpkGcr+q#:aNoj1P[Y_XZGUh+0#7Wn3%n3B-=9I3t>5"MJds=SlQKM4YtVOCG9,:2E>Qs - Ss.,WF6Plb)'dQplI&/Fd"s$sm6C4CaR#e*6l;+\b``?p0QW\)k+$2*r*P6gW.K[fim8ZSe - 1F7NR)YdeK0))h]fDku,QrX>7s>r,CGUYeJ-os=,*\tae3ns0=%[oo7KfY6`gC4/1T?R.FE - pBP8>rmX/^u$bA.BlA0YGFp!!U%Ud5&4+ReJD,pPkuZ4n:O[AY0%b87Na1X)fUZ)8>D^G4^?>BQQA9@I&i;d%)Q>BT%6Fm335nO14d70 - 32+1HmXMXY3YG0=7Ia07?t*?V9^i\gsZQo+Kg-\282-WJtDnc&s0#kP_TXpId1a"Bp0tWAp+VQ8BU#=,//V - _S9FUgBf;2$$&g[<:,"!d?e$tcUqnL3`\Y"b*d'bVf""ou9'+D[+>^VPOpu38c#!+$D(_G_ - &:[eYKijYkDDpTo@p*12S@FQMpN?j\L=.u::-CeI2cF[uXD - h)\F?tXMQWH.%a?D`6pl?ZN$S8#kB[mQ$9B[#t"3fDTd5GoiKAnXH]``F04^E,eT\PdWC@PZFUb0WL" - ;`pRM0BYUOHeY&F["I4O4%Lm%tF/Ta#`@O!SOCYT6>io]LBB!Mo`%19^AqQ]a7L4O]e:-TK - :a]!a&s,n!DK$hPCLXRQ$Uj4F'T:!mBc(uJG^+dpY]H`cArk#0c0[@0U - 5dLnmd:$?UZMACBBG`7XKZoKT/["8;oUloJYfqJ]K0ZUY7`o!j-14Ak+W*j0gFUaCp3aH:" - 6MJ^IA+:8jm`BEpT1An7@:Bs,UECDOCm2c(\XAkrSVd-T#SZqO3Vkcj88 - o@l=6nkA;32e/RB(W4sEeK<@"I_0t0kf'SHL?JOUcLr?B/!:9'Ukf#J`F2NBI8TeFV8,s0W - $jVq6?fs]9r7e"8,Tig3KU-I8kKeD:d7*\ppZiN1UuqIQ=qloVF6$fH(7KNVE$QG70q+bFI - *.G9].]&B&,B->u?&e0iui]#Y0KEgim-MpD)\mg->>3%AK#i!*^uAO^_e3e@P'?c<(#X3-F - bmUM#j+_7,%,rWN@kftW[Zjg)68(p#k@=uY?Z9'A<6ajF4FB!K+5,c,tiANi2mSEGC/B!(& - >%sr49U,Bn"1Pt$gJ>5h?+'/jW&N*gRYeHlD78VUWAXis3gjo3^Q#A!Wd2QlYEK8qb`bHsC - !/2D7ikGOLC3)0<+SO2764bMg-'&(:Mpi.,K@!dk--SU@Z)('O'40s]`J=38dFeF6rL\>P$ - `no4Kli,e$8+#ZZ/hLgjF`^H5H&rNI8J]Q* - %6e`!f>pk7!0=&qQ"pf,;N+Af9MZ_96;N/(T:+X^0*cU:HZcIZ,3bl\HMC+#8.iYgW_$4Ss - J]J[7nr_//c-5`M1V[b=o?[@9cmO[f\Yj+"isXdtNt)HP8d^jFITbdH+6!=[j?(dJHN#VkDd22piu:YIhKVLq_ea_tR=9MHI - Ym9`;r(L3N'<6cHq3$3QdOI;dMefto*aF,q;36]lT?KVqcD,#[Hmh.gYS(1oo&0#c*[J@?s - 1*j\(BKDZg.6)m/H+F^:D,8=mgb/mlVo_HYLD>p$_^Im6)E-*o#+%!OuDa`SU^dH&M+#WMb - 4`ninFhrqW"SrUPFmID5rF3h,Cn_YbPqS0H8 - E]Np.g&%DX5/3BMI381?S[^nZhZ'MO5M7_tYOWdir]fMQ,Xd;^I=1rUn%R!EJ,(19`ZPE5l - j[)$DF*1LQrG[U%>R=1&K$a-.2@b0it7[.DC4k60OtJ-&V`h3P5qE\fhlopNL):F%`srUBf - 2ASk7a95mWgsf:ZrK2'b6'hUJ^7iRT1tc13Q>-P2pG`].+T=!)d6iOM`85YUgCLKegb]ZWZ - Z2RoQWED7X<&[2:P&8)8?_]CN>N)O4(GfO=b)'"r<.@&(fmd1G - 2LH';"&@;Hi&:6rBdm26`-:r.$k!jjWR^1 - PH3!34&`#6jY]#o1X]XLb]P@61'OrOees;;O+)XH=E;YnDlYA6h(:G[^c]sPa4=d6_'<#$O - T$/7Ic%@)+JVACE#49$c_bMmn;7*^$gmB)p!%FM^(d[lhpfK:a?JQ5ts^Gek$?&,2'hC$Z- - 7TXirP,2j0uS0hcX6b+P;H6^!crBiCIa3U%3OGKt7dlT7l5`:H,fC$DT]7n`^\_6C"&'#bd - ]7/98KFCcBh8PJG6d'RX?:Bi[qFWA%dc(la*2Xn5fh*X\D2,dKI78h0ueR_p,N,l=dBefE - Em]6b(rq,%4))(OA.:U_6%RuZdY)UZiN)s_&D.IGEr&T?h<*iB-4&6$?T\;c4WS)Ff;iTX& - [N^8)e+J.]6[!*Pm89Gih)KA*sM)J`+'^ph8aM(/d2)@P1k+Y_#>Rns%h&_ieLFFbc&kH00 - GYh%F9H"4FDZhb7?:npu*"/Z^ILe285\IVCj?X/e3_'qLL0HK!2R(E3AiYmYn$=gKUZNm]T - JA9Q\*9a>"7IHL@M=f^uf`q-lX3mJ%`mRPk2F:N[F=sE(dc=/%]Y8s9MmTZPCSSrnR/'BL_ - "k=u6P)\GDVOCh\:WmeGohol07oRqcq&]R=E$s&XfbXO['AI>ThTQaP)ckOh(OcD6iH?2q$ - \@u"8!E%[E=H-Sp&#-dko'Jo60iKBR#13M!^F;3%^qKjBmaR>bLghtT:,A#ISVa#kYcib.8 - rH?)pm'a"M&p;FYE(\5PF[>Qn,CgUZ?d;EQ8,LX:#UO1bCueFB/Eq'.Sql7Bhnpf7uHn*q0 - p(O2o]L+VZ/SOHd)U2WXsIi:VeV1)C8\@"q*WlmZq$spf'h10LU`%(02\#=9H'R`UUDS?Pq4#U@_*uF9E6::aD$S?kc*" - SK)(bRZ<.l`sp\jm"[?;*Us=c8,30.@acSD;AJ.#OhW)@nCAJ_1f[*:#p_k0P6V_#!s(tI% - cl(N&FspDamkoM:RL+*MS+'B3DgB!'W[LUQ6ea#3>8$\,)Ro).Q&'H.qR5B7VdO!bOND&?D - ,VG_YR&cfZkehHk-TMnn/!VTN2(%dg,JDWX$YN*Y8HA17"Y;Y"m(H-j=X"9i - 2nTgT?0NBCTN[2j\/stg'EC7oRIj!HJk/EH_DKP - L$-0LT*\=i_bl?$!+.,mZ"-ZW2f*NPPq\n2THU0:u - @&h#omFbbPuPi)Om)c-elrEnX^sD4YqZd7'( - gK\!H[Cfbk)>>]@$ZJkk>nTW)sGTJa91Rca]uTE4JB$+c5R$j(d[%Be+A$MS[[#B;>?7CD/ - <2+H@f)h!$N;+%PW1&3inTL[@m9RdP7rOR@-IW*UqDlf4UR`X^H6uZeSJHH!Zi(OCF5iGd"g-D2l$I$bVS<\k7W!kLnG[@CI>59A3q4]O5LG[,E=c^FMlBDhk(F;'[nF+/&"l%_ - C>VMg43e1$Z^TEfFJ(!(nZ")3*VFFZMc!P%V*T"GaBma*l6f7%8=!HAJY,Y'&=-f:)G@C]/ggFr&!JRhoRNI?CgY6IF3`;F>X-0kRCR:%;*L+L>Ii-;qF`CAu>K9e_$G,fr/QOBJ&PD;iiG^72F'@C8di![7%32&3,5'4#'naQLu>?G7WJnL9DUVi?V7k8*W[& - 6A*[PGCX(uEX2Rra$uc?\#'kFD5e+9V];\e(MJr>#c>&EFUQ-70u"5#N8=*YUe9an00c/ - >35mnEPiK1O.6[p`FX-YWajK-9`M7iPY89J'n+B=6ogW\+b@Oc5ZeMoDW11q_9$r&&6T)aT - -5a1ogqi\-"ZVdkUn)1t/LU;bfJ+8?E.63b#LKMf/\2qZCp95eHeVbRHhm%RB@k5l;0Z$kY - cF&j\&^5s,iI9GKiu(-uaQ6$sM8N#=pO)F:GD6+e1'bT0")*^>;c^SD4=Lb(k0o7<\^1/JR - E1NG5A#QR5kMSQ;SS0kN4XKg[r_Ri[8;l'Q:2+$XO^RQ@])GYrH*[<.YV]5(l8Ud.\7?*I? - KZ#hQlo@5==KSWk%[n#u+L+)hLBbmtL3).)'C:dLk_C?G3&EK\8S"53q59U`31)UbC]-Yk8 - joaR7(c2]bY:L\:''q3Ja61<]!.6"#;DWA3h-9Z_UAk1"$dPIYaa(MF:?7_EP,b\0EB:TI#,)b: - gK^_=)5,="pL^_<]_,1A!YF?5pn0S:H+@0@g"'Lr4!!SgmKe7+<.5f`/C0niYn=K0iZf9XfHL\a82toOU*-'gK#fL((+GD6qApg.T!rc5aZPeZ9U/1S - Q:YnZ8UQc-oM[B,FLO@\#t/pXbah1-S&Jk[Z4fqdRib4TU.Qu38j&nA9Vk?dVFk[&8pmR0N - 2]F>W_0@n9"_5tbcOLmY"J&a9)Pnd%'`GFZ:caT904=f1C-5[<6=Ks8_gg)`1FG+MloLot>9R-#o+iaakaoiF%-=h'^]Zj.*c:m - TN9`373%+.chc)jeR2fg34.dB'b<'W5^2al:W4P*1"!l,KQ[os]blO6K5hG*@o:&NpE%,jr - $i_D&b:-@T49]]#Sk"]aU:428#EjN!d"@)2V1,C.3o1ooQ9;KGj5O2._7-Mr:nkUh.:H\8F - 9_D1dp.oN!:%T\fMX(g09#j?N!%\4HN;W_r"&HE.[*qb]1@#K>nP=Pq*)Q_`e3KLVaA?^Y: - jiU(6%R*T@_3T3"9F=aFU_1'%T)O';#Lr&%1Y0W&lC4n-e(qt@iR6[9#+(+a#cr*RnZ=tl: - N!>%nn6="A-8F'2dsD;&(3O%3\Ui,#U!;;EZ:'9dN\C-;n\.;LKrkN@@br.T3AZ/k@H';8Y - ek;6jT1$F/Cf>qnCu'gQ^WdlXEH6fb4p<`O!<1=1Xac([(9Icd9nc\TL0/;J=FH!*ASQleBnSVWK3a - F5,GnBN'tSY;4Y'9!P6oX:Z*tt+]$_OTYl[6//4>07";ETCRX8.rDhR5A3*9<6UHD)d;H`C - Z=oG!:+]bK[h@H+<"oY5V]qnn(*>QMi4QD$mJ7[Rc+R?;^0C!>>Q)?B%Dc9i_H\\1>Wp#19 - uU:>H&io%XNDOc*Q\ZKOc#jf6J]`c)=OK/D'hEbh#5T*%FJH%dTnHR>s6\C:"9F$QBUQ6s2dV52"AL<`(?h8n$oG[>E-1!Bis1s]e-5(0bC6*/YLskl<^ - UY*3$Im%#bQ.JHokd?N'A#%ImdGnm=!?)hGLF1..sS%7gNhd(3gP<9gbUlS:7'[j)6h@.gm - cdmiqkXN:1Napf_56_u[4'1MM#:'G$3#%2)V$IqA]]m>:/pUKumVCRUuq\%q'qP"=9^0k,TMAQ - KeHWt?RfG\Q.j#07B!%D?s--et$?8n8r?\aS)iH-g,"b$L]D`q!hf]**)&`#qZ;9-8:>?ZX - _G$PXNN&%]7jUP[1%Uiri:b$am(b.[>!b7,Y*C-!l=^srb@.p^N/4/*RfEHMPbDN1T=>Lk= - jn-RT+j8qe;IkMR+biV@IS6_j9]Xo&jQTe-qN9qQc`DtSaM^9;.0*Ref]I.=13GcC_ou'@Q - 3sJ4Yj-Q=*edc_?f?o(0eRG.VMSuXMJ0%(XGuY/R`bmV>m5;5"Nh*VD1Uiklp.Qk1M$sEd& - C0P:.(dmiJK8OL,?C]V3c!SC`E&KGiFTZ*F0E:N"X - A>W*nNu6D_@uIC^U8J>NS!JlsL=L-Ieno-p*JB@ql9hYGeg`3:[`UA/(gA=:g:kYtaAU/+3 - ^,$P6u?qWlk:g``khjJ_ZUanACdDdI\CD7U1^(X)S(En$?=qf%62Ou*-3jK(h+^>1:G@\W[ - jGrb')Y-.O#APm_8I7NqmU]O!#2t9I]P*j!kCX6HE!mVA_n0_qk`BN$8T>+sNh$Tr[THAaW - T@CbBjH5'Ca;kj2X?lu)+TIg$anq]#Y#Ss")_KL1Z+n>'/G!d=F+6.]XuG4Zl!E#'$??S,U3;E5YpteYj - nCa%pEeue-LPLPmWT!*LFMYX.dj2bm^GHZ="U"gIA.*!,N6-TdLC9UO)QQ4A6/p+O&:$A;K - XDRBWEi1F.a'0?%+),njC3HPf/cl'D$3K]Oo(<(>ori-IQX"E7k3d];ChC_3$&t8V8o_]LLX.g - AP7r.AH?ZQ>GJAMS2f\NBEqE.Kn@s)>c[g<_Jp8r$GX$ieQ[SKZIeEGboPY.[IgpWuMKl=_ - Ge]2^cJs.USa#R7oNquNLOf0OP'J^EGs@O=9i6/u-[>A7FpCN\(R99Nj*kq0IXgR1M&MkL - r?Xco$?cONcg?2=mXFWnIb#(%V@eM?&r7SBN'ZpD6hBBa(_sd'oO849tn"T)eoC;CJ= - 6Y4lrdXD:#Qt&0"+igHd!.r*'aoa`@F4e&7O8_*7:OYh`+CkGN^mU,poF*Voo_CIc<3MX<7 - R9l-.;UB`aprp9kMjDCuok&<)6E@oGn(p6T7k:P]KPEcV$%B:)*=P75\"FeQA)^]k4ZVXu. - .UpD&D4@sM3aM&9fR-.9'oU(AES12 - D7jXAAATHIO`b./u\3Ddq%0Me^f?uGHbPad%3q$d[;\oSQ - __6"&S9!4,aicd;;-`bV7]NZFom5GC_Y&oCBm3e;pKrXCj3DpthLA%nea)pUIGY!Za5uphI - =C('a63-mrdTFDquHf'BAn;AlAVS8pXS,f!;_R3p&(I%_ - t2;Oj^9b0mr-/B^rH\Lu(Rr4t(]90)X/*2\D9SX4;P,;t\UI,R'1;k3)5cI9GkkE/.(pn<^ - "r*h!L6<+::d)%pW,>gcR)*nRh8@9=p"19QgOH[X<9[cto*_t2'PsAj/7cd0ceC,.0<7OuS - =]X)'I:67/h;Zco3RpZqmKuLQ5hqW%i.8pAD(!hR:b.'IA&kn@dU-0MKCP8+ - 'V%u\/nkje\E0[6,gr_#Ljl\.c!i:^nZmTL#I:5=.&8?hU'qB?!g0Kh1!t"rW.Q-=<7d#i7 - L4*K]-$>)2@,&HI@1M9)5eN3[EY\N/RJ`[uTM$r]uY,=WU.tjDg!LP_g8[JX5)B^gWUaq3Y - HVKt4]rS:u7F@Mi?9aG$:DH5og4AD050V!15"SiBIKDP1TV:c9JslIrtWXQs'H\ZY8PrkYi - *>8uAfT(4>-=D^HM>Ft)jmb>JG]A2*7B>3NeBMlQu>TX4_nA,>@&+Nn3#Scg^ - QsL^%6/O-(o%^u7b_Q>H3K0#q#=,>WLHeA9FPT/YeFd*S=k<9%Ipq"'?(1&A*kIK$;KkLkH - #%&$=A@`K?6>$`pte5tjS7[eRDT.MpRhul5f]f1HJZ.Zm/(,9-1:X/TJ-k'>ZaMeq-QA6o_ - h'6JftSQGpiC3;E;eOIc%p1r;U-]q>UE?rW#2#"C+hqoN3O&9WmL$"CPUFJ^?Rd5o:mNi1q - *>cs-`?O:qi66lc9sHil\P70qit-%k+s%Y0?n!as(VK(-Jk6Ps>8h>/iU+r"1tOhhOc*'K) - (rZFTGKb35h7>T>4,T1fBBnfgd3MG8!5#=]R@\d"]d9\@mR'd^hjB[\kIP=5.`>IV\=E8rY - hh^LG/n8-j.pgXdG?uUR.ROc0\2<%g->sI"L2WI!!LJpF,,KV3KE"<(`QY.ck3C+c2@@7*'C"`8%au_?O7j`K%Adp?ibRC+s8jP?q]5lD7L\eR#=WRTqp%*D*+>( - 8B;8#X6?ArMR&pZrWXG>3fa:Xjt*5VFV%cLM\R^2;JBEVU4`8/U\Gcra+c[2/=Tgr"5#El0*d^":!n?Q8*Sn"o]kfA?F4S*G"1j6mFclMr/L&gf:X - S\3BuA2-I]=RQ.t_:UsX@2pSHn=mIf_f#rkMju3"i/PXt*'>2P`1qml-&Pfs'OmS4MXb:1` - RqpB@iSh#6!upsb?@SoA830)n;Y>;MSRn8ksY$D7EF.(,\3F1P4E%FX(IH/f`?_H"^/B3Jb - pF?m'V[9ZrMeTIkYIS`L-6DA^&i"1hN9'pHXffc-(&IKe2;\ZFRM,G"Nd8$AXgdk'bS/s$1 - 6<"eTEK(`RWj=kp':,1-_9$d2oqBbqS]oVRo%g0[NfSMd;:k+0t=";F=N%u?ICG#)0ho/hn - cYB1hfe_7c?CE6ufkZ(29j*JipWL>;2a[$JH^L/eX&/!]``RroeA8Ig%ZM%nTg"S`)CrOXB - _[b3,>?sl@O]AjUpqAhb898Y_afRKKjkSU_FDdZ!rb7%'g[h4Lb:uN"k#d,i`=t7<^mi(4k - 5F2ls+#&0"i0m\"lS/XJM^3D_S_uTf?4sPgEC9<7P7N4)io.3Si+O_k8iUjS[&INm@q]LY)"Tp^m+05D;GN5pXns?AIho3&9aYqgA>N"mG5OeG95S#n_[pEIG@! - /QImE9+IM"pN9R4@&U<>Y(:r8k0&0*d - 4l/=LV=`W:e9[`elMX3G&*d@"7\LjL8sl(9m6F^n!GlKSrWm?DW,C&+@H%-6`VA=4jF!SbT - W"J,*d)u.mDsHo0GleJa?Oh[Bi<9;00*;bA"&L - oYO?3Qk56MNMa/NeeA/t>'ID[-hoPcDm-C*mc>N\%1 - ]Y(R4i8*J^n@-_DW:IoC1OIHR'T*c.)$;dW-OIZ3$,-W5U$Vle[MD2#ekc;SCJ>UOaO,4*< - cOCH7%8bXcLkr.4=Ie?E9h0:>O(8h6mgg!$%oE!2OS]R8rt#bE%hM9&+_%`ODY_Z6&Q'>VO - W+n[*e0$`ZNYs'O$#f^nIlKj'2^\%OZO6(584\dL@7#p93P<2it;r&'iA$IO]rR?$ES--!W - dOTm_WJQXVVRj(K#AmOa@nlIi&c>h[a8`@@\7W`te-.),Z_^FU#8/5jL=9$4J0d+b[GkV$L!P1qS:h_ - #Q%/lLjbP2*T@SI7`JS>ZfHP5?o\s"G)f]4uel%S4smlJ;nW0iJlCP8c7*+#4KS1/f&D/&n - n&kfAqk1K-4gP<1SCBWS#NCr^@h'2(12:Giea2,dR6P?Tn:^n>EhS1nS3o4p85D`8>N2cFo - ZPC#7;IlJ*o3)bSlPD_ELO#[l;3E)8)PFFS]T/mX\3`Dq;PH-anY<*E(4&`UMPIip*^H<1I - 4B'9_PKQ);cTMrj4]BrqPM87Lh`__65#^W.PNtE]mlqKW5?%;@PP[Sns$.8#5Z@tRPRBb+% - m^mC5u\XdPT)p<+$pYd6;#ZK+9~>Q -Q -showpage -%%Trailer -count op_count sub {pop} repeat -countdictstack dict_count sub {end} repeat -cairo_eps_state restore -%%EOF diff --git a/docs/figs/sram_overview.pdf b/docs/figs/sram_overview.pdf deleted file mode 100644 index 4a533d27..00000000 Binary files a/docs/figs/sram_overview.pdf and /dev/null differ diff --git a/docs/figs/sram_overview.svg b/docs/figs/sram_overview.svg deleted file mode 100644 index f80583c7..00000000 --- a/docs/figs/sram_overview.svg +++ /dev/null @@ -1,760 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Precharge - Decoder - - - - - - Column Mux - - WLDriver - LowerAddress - UpperAddress - Write Driver - Sense Amp - - - 6T Cell - - Data In/Out - - - - - - - - - - - - - diff --git a/docs/figs/timing_read.pdf b/docs/figs/timing_read.pdf deleted file mode 100644 index 6f859889..00000000 Binary files a/docs/figs/timing_read.pdf and /dev/null differ diff --git a/docs/figs/timing_read.svg b/docs/figs/timing_read.svg deleted file mode 100644 index 16fafe00..00000000 --- a/docs/figs/timing_read.svg +++ /dev/null @@ -1,633 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - CLK - ADDR - CSb - OEb - WEb - DATA OUT - A0 - A1 - - - - - D0 - D1 - - - - - Setup - Hold - Setup - Hold - - Read Delay - Setup - - - SCLK - - - - - - diff --git a/docs/figs/timing_write.pdf b/docs/figs/timing_write.pdf deleted file mode 100644 index 810ec2bb..00000000 Binary files a/docs/figs/timing_write.pdf and /dev/null differ diff --git a/docs/figs/timing_write.svg b/docs/figs/timing_write.svg deleted file mode 100644 index 6bbfdcb5..00000000 --- a/docs/figs/timing_write.svg +++ /dev/null @@ -1,811 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - CLK - ADDR - CSb - OEb - WEb - DATA IN - A0 - A1 - - - - - - - D0 - D1 - - - - - Setup - Hold - Setup - Hold - Setup - - - - - Setup - - Hold - - - - - - - - D0 - D1 - XMem Cell - - Write Delay - - - diff --git a/docs/figs/tree_column_mux_schem.pdf b/docs/figs/tree_column_mux_schem.pdf deleted file mode 100644 index 7a4e505d..00000000 Binary files a/docs/figs/tree_column_mux_schem.pdf and /dev/null differ diff --git a/docs/figs/wordline_driver.pdf b/docs/figs/wordline_driver.pdf deleted file mode 100644 index 4eda2a71..00000000 Binary files a/docs/figs/wordline_driver.pdf and /dev/null differ diff --git a/docs/figs/write_driver_schem.pdf b/docs/figs/write_driver_schem.pdf deleted file mode 100644 index e943ee80..00000000 Binary files a/docs/figs/write_driver_schem.pdf and /dev/null differ diff --git a/docs/figs/write_driver_schem.svg b/docs/figs/write_driver_schem.svg deleted file mode 100644 index 3882dffc..00000000 --- a/docs/figs/write_driver_schem.svg +++ /dev/null @@ -1,643 +0,0 @@ - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - vdd - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - en - - - - - - - - - - - - - - - - - - DATA - - - - - - bl - br - - diff --git a/docs/figs/xsram_block.svg b/docs/figs/xsram_block.svg deleted file mode 100644 index 1d0d465d..00000000 --- a/docs/figs/xsram_block.svg +++ /dev/null @@ -1,199 +0,0 @@ - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - Block Diagram of XSRAM Topmost Instance Datapath - - - XSRAM.XPRECHARGE - XSRAM.XARRAY - XSRAM.XCOLMUX - XSRAM.XSENSE_AMP - - XSRAM.XWRITE_DRIVER - - diff --git a/docs/gdsmill.tex b/docs/gdsmill.tex deleted file mode 100644 index 32cf68dd..00000000 --- a/docs/gdsmill.tex +++ /dev/null @@ -1,33 +0,0 @@ -\section*{GDSMill} -\label{sec:gdsMill_permission} - -OpenRAM uses gdsMill, a GDS library written by Michael Wieckowski at -the University of Michigan. Michael gave us complete permission to use -the code. Since then, we have made several bug and performance -enhancements to gdsMill. In addition, gdsMill is no longer available -on the web, so we distribute it along with OpenRAM. - - -\begin{verbatim} -From: Michael Wieckowski -Date: Thu, Oct 14, 2010 at 12:49 PM -Subject: Re: GDS Mill -To: Matthew Guthaus - -Hi Matt, - -Feel free to use / modify / distribute the code as you like. - --Mike - -On Oct 14, 2010, at 3:07 PM, Matthew Guthaus wrote: -> Hi Michael (& Dennis), -> -> A student and I were looking at your GDS tools, but -> we noticed that there is no license. What is the license? -> -> Thanks, -> -> Matt - -\end{verbatim} diff --git a/docs/implementation.tex b/docs/implementation.tex deleted file mode 100644 index 187bcd48..00000000 --- a/docs/implementation.tex +++ /dev/null @@ -1,389 +0,0 @@ -\section{Software Implementation} -\label{sec:implementation} - -OpenRAM is implemented using object-oriented data structures in the -Python programming language. The top-level executable is -\verb|openram.py| which parses input arguments, creates the memory and -saves the output. - - -\subsection{Design Hierarchy} -\label{sec:design} - -All modules in OpenRAM are derived from the \verb|design| class in -\verb|design.py|. The design class is a data structure that consists -of a spice netlist, a layout, and a name. The spice netlist -capabilities are inherited from the \verb|hierarchy_spice| class while -the layout capabilities are inherited from the \verb|hierarchy_layout| -class. The only additional function in design.py is \verb|DRC_LVS()|, -which performs a DRC/LVS check on the module. - - -\begin{figure}[htb] -\centering -\includegraphics[width=10cm]{./figs/class_hierarchy.pdf} -\caption{Class hierarchy} -\label{fig:class_hierarchy} -\end{figure} - -\subsubsection{Spice Hierarchy} - -The spice hierarchy is stored in the \verb|spice| class in -\verb|hierarchy_spice.py|. When the design class is initialized for a -module, a data structure for the spice hierarchy is created. The -spice data stucture name becomes the name of the top-level subcircuit -definition for the module. The list of pins for the module are added -to the subcircuit definition by using the \verb|add_pin()| function. -The \verb|add_mod()| function adds an instance of a -module/library\_cell/parameterized\_cell as a subcircuit to the -top-level structure. Each time a sub-module has been added to the -hierarchy, the pins of the sub-module must be connected using the -\verb|connect_pins()| function. It is important to note that the pins -must be listed in the same order as they were added to the submodule. -Also, an assertion error will occur if there is a mismatch in the -number of net connections. The \verb|spice| class also contains -functions for reading or writing spice files: -\begin{itemize} -\item \verb|sp_read():| this function is used to read in spice - netlists and parse the inputs defined by the ``subckt'' definition. -\item \verb|sp_write():| this function creates an empty spice file in - write mode and calls \verb|sp_write_file()|. -\item \verb|sp_write_file():| this function recursively writes the - modules and sub-modules from the data structure into the spice file - created by \verb|sp_write()|. -\end{itemize} - -\subsubsection{Layout Hierarchy} - -The layout hierarchy is stroed in the \verb|layout| class in -\verb|hierarchy_layout.py|. When the design class is initialized for -a module, a data structure for the layout hierarchy is created. The -layout data structure has two main components: a structure for the -instances of sub-modules contained in the layout, and a structure for -the objects (such as shapes, labels, etc...) contained in the layout. -The functions included in the \verb|layout| class are: -\begin{itemize} -\item \verb|def add_inst(self,name,mod,offset,mirror):| adds an - instance of a physical layout (library cell, module, or - parameterized cell) to the module. The input parameters are : - \begin{description} - \item[name] - name for the instance. - \item[mod] - the associated spice module. - \item[offset] - the x-y coordinates, in microns, where the instance - should be placed in the layout. - \item[mirror] - mirror or rotate the instance before it is added to - the layout. Accepted values for mirror are: - \verb|"R0", "R90", "R180", "R270"| $^\ast$Currently, only ``R0'' works.\\ - \verb|"MX" or "x", "MY" or "y", "XY" or "xy"| (``xy'' is - equivalent to ``R180'') - \end{description} -\item \verb|add_rect(self,layerNumber,offset,width,height):| adds a - rectangle to the module's layout. The inputs are: - \begin{description} - \item[layernumber] - the layer that the rectangle is to be drawn in. - \item[offset] - the x-y coordinates, in microns, where the - rectangle's origin will be placed in the layout. - \item[width] - the width of the rectangle, can be positive or - negative value. - \item[height] - the height of the rectangle, can be positive or - negative value. - \end{description} -\item \verb|add_label(self,text,layerNumber,offset,zoom):| adds a - label to the layout. The inputs are: - \begin{description} - \item[text] - the text for the label - \item[layernumber] - the layer that the label is to be drawn in . - \item[offset] - the x-y coordinates, in microns, where the label - will be placed in the layout. - \item[zoom] - magnification of the label (ex: ``1e9''). - \end{description} -\item \verb|add_path(self,layerNumber,coordinates,width):| this - function is under construction... -\item \verb|gds_read():| reads in a GDSII file and creates a - \verb|VlsiLayout()| class for it. -\item \verb|gds_write():| writes the entire GDS of the object to a - file by gdsMill \verb|vlsiLayout()| class and calling the - \verb|gds2writer()| (see Sections~\ref{sec:vlsilayout} - and~\ref{sec:gdsmill}. -\item \verb|gds_write_file():| recursively the instances and objects - in layout data structure to the gds file. -\item \verb|pdf_write():| this function is under construction... -\end{itemize} - - -\subsection{Creating a New Design Module} -\label{sec:new_design} - -Each module in the SRAM is its own Python class, which contains a -design class, or data structure, for the layout and spice. The -\verb|design| class (\verb|design.py|) is initialized within the -module class, subsequently creating separate data structurse to hold -the layout (\verb|hierarchy_layout|) and spice -(\verb|hierarchy_spice|) information. By having a class for each -module, it is very easy to instatiate instances of the modules in any -level of the hierarchy. Follow these guidelines when creating a new -module: - - -\begin{itemize} -\item Derive your class from the design module: -\begin{verbatim} -class bitcell_array(design.design): -\end{verbatim} -\item Always use the python constructor \verb|__init__| method so that - your class is initialized when an object of the module is - instatiated. The module parameters should also be declared: -\begin{verbatim} -def __init__(self, cols, rows): -\end{verbatim} -\item In the constructor, call the base class constructor with the - name such as: -\begin{verbatim} -design.design.__init__(self,"bitcell_array") -\end{verbatim} -\item Add the pins that will be used in the spice netlist for your - module using the \verb|add_pin()| function from the - \verb|hierarchy_spice| class. -\begin{verbatim} -self.add_pin("vdd") -\end{verbatim} -\item Create an instance of the module/library\_cell/parameterized - cell that you want to add to your module: -\begin{verbatim} -cell=bitcell.bitcell(cell_6t) -\end{verbatim} -\item Add the subckt/submodule instance to the spice hierarchy using - the \verb|add_mod()| function from the \verb|hierarchy_spice| class: -\begin{verbatim} -self.add_mod(cell) -\end{verbatim} -\item Add layout instance into your module's layout hierarchy using - the \verb|add_instance|() function, which takes a name, mod, offset, - and mirror as inputs: -\begin{verbatim} -self.add_inst(name=name,mod=cell,offset=[x_off,y_off],mirror=x) -\end{verbatim} -\item Connect the pins of the instance that was just added by using - the \verb|connect_pins| function from the \verb|hierarchy_spice| - class: -\begin{verbatim} -self.connect_inst([BL[%d]%col, BR[%d]%col, WL[%d]%row, gnd, vdd]). -\end{verbatim} - The pins must be listed in the same order as they were added to the - submodule. Also, an assertion error will occur if there is a - mismatch in the number of net connections. -\item Do whatever else needs to be done. Add rectangles for - power/ground rails or routing, add labels, etc... -\item Every module needs to have ``self'' height and width variable - that can be accessed from outside of the module class. These - paramaters are commonly used for placing instances modules in a - layout. For library cells, the \verb|self.width| and - \verb|self.height| variables are automatically parsed from the GDSII - layout using the \verb|cell_size()| function in \verb|vlsi_layout|. - Users must define the width and height of dynamically generated - designs. -\item Add a call to the \verb|DRC_LVS()| function. -\end{itemize} - -\subsection{GDSII Files and GdsMill)} -\label{sec:gds} - -GDSII is the standard file used in indusrty to store the layout -information of an integrated circuit. The GDSII file is a stream file -that consists of records and data types that hold the data for the -various instances, shapes, labels, etc.. in the layout. In OpenRAM, we -utlize a nifty tool, called gdsMill, to read, write, and manipulate -GDSII files. GdsMill was developed by Michael Wieckowski at the -University of Michigan. - -\subsubsection{GDSII File Format} -\label{sec:format} - -The format of gds file contains several parts, as it could be shown in -Figure~\ref{fig:gds_file}. - -\begin{figure}[htb] -\centering -\includegraphics[width=10cm]{./figs/gds_file} -\caption{example of a GDSII file} -\label{fig:gds_file} -\end{figure} - -The first part is the gds file header, which the contains GDSII -version number, date modified, date last accessed, library, user -units, and database units. - -The second part is the list of structures. These structures contain -geometries or references to other structures of the layout in -heirarchical form. Within a structure there are several kinds of -records: - -\begin{itemize} -\item Rectangle - basic geometry unit in a design, represent one layer - of material in a circuit(i.e. a metal pin). Five coordinates and - layer number are stored in rectangle record. -\item Structure Reference - a structure that is used in this - structure. The information about this reference will be used store - as a structure in the same gds file. -\item Text - a text record used for labels. -\item Path - used to represent a wire. -\item Boundary - defines a filled polygon. -\item Array Reference - specifies an array of structure instances -\item Node - Electrical nets may be specified with the NODE record -\end{itemize} - -The last part is the tail of the GDSII file which ends the GDS -Library. - -\fixme{Provide a link to the complete GDSII specification.} - -\subsubsection{GdsMill} -\label{sec:gdsmill} - -As previously stated, GdsMill is a set of scripts that can be used to read, write, and manipulate GDSII files. - -\paragraph{The gds2\_reader and gds2\_writer:} - -In GdsMill, the \verb|gds2_reader| and \verb|gds2_writer| classes contain the various functions used to convert data between GDSII files and the \verb|vlsilayout| class. These classes process the data by iterating through every record in the GDS structures and check or write every data record. The record type (see Section~\ref{sec:format}),is tracked and identified using flags. - -\fixme{Do we need more information of these classes, or should we just point to the GdsMill documentation?} - -\paragraph{The VlsiLayout Class:} -\label{sec:vlsilayout} - -After the \verb|gds2_reader| class reads in the records, the data has to be stored in a -way that can be easily used by our code. Thus, the -\verb|VlsiLayout| class is made to represent the layout. -\verb|VlsiLayout| contains the same information as GDSII file but in a -different way. \verb|VlsiLayout| stores records in data structures, which -are defined in \verb|gdsPrimitives.py|. Each record type has a corresponding class defined in \verb|gdsPrimitives|. Thus, a vlsilayout should at least -contains following member data: -\begin{itemize} -\item \verb|self.rootStructureName| - name of the top design. -\item \verb|self.structures| -list of structure that are used in the class. -\item \verb|self.xyTree| - contains a list of all structure names that appeared in the design. -\end{itemize} - -The \verb|VlsiLayout| class also contains many functions for adding -structures and records to a layout class, but the important and most -useful functions have been aggregated into a wrapper file. This -wrapper is called \verb|geometry.py| and is located in the -\verb|compiler| directory. - -\subsubsection{OpenRAM-GdsMill Interface} -\label{sec:wrapper} - -Dynamically generated cells and arrays each need to build a -\verb|VlsiLayout| data structure to represent the hierarchical layout. -This is performed using various functions from the \verb|VlsiLayout| -class in GdsMill, but the GdsMill file is very large and can be -difficult to understand. To make things easier, OpenRAM has its own -wrapper class called \verb|geometry| in \verb|geometry.py|. This -wrapper class initializes data structures for the -instances and objects that will be added to the \verb|VlsiLayout| -class. The functions \verb|add_inst()|, \verb|add_rect()|, -\verb|add_label()| in \verb|hierarchy_layout|, add the structures to -the \verb|geometry| class, which is then written out to a GDSII file -using \verb|VlsiLayout| and the \verb|gds2_writer|. - -User included library cells, which should be in gds files, can be used -as dynamically generated cells by using GDSMill. -Cell information such as cell size and pin location can be obtained by using -built in functions in the \verb|VlsiLayout| class. - -Cell size can be finded by using the \verb|readLayoutBorder| function of the \verb|VlsiLayout| class. -A boundary layer should be drawn in each library cell to indicate the cell area. -The \verb|readLayoutBorder| function will return the width and height of the boundary. -If a boundary layer do not exist in the layout, then \verb|measureSize| can find the physical -size cell. -The first method is used as primary method in \verb|auto_Measure_libcell| the lib\_utility.py, -while the second method is used as a back up one. -Each technolgy setup will import this utility function and read the library cell. - -Pin location can be find by using the \verb|readPin| function of the \verb|VlsiLayout| class. -The \verb|readPin| function will return the biggest boundary which covers the label and -is at the same layer as the label is. - - -\subsection{Technology Directory} -\label{sec:techdir} - -The aim of creating technology directory is to make OpenRAM portable -to different technologies. This directory contains all the information -related to the specific process/technology that is being used. In -OpenRAM, the default technology is FreePDK45, which has it own -technolony directory in the trunk. The technology-specific directory -should consist of the following: -\begin{itemize} -\item Technology Setup FIle - In \verb|/techdir/setup_scripts|, there - should be a Python file that sets up the PDK and defines anything - necessary for a given technology. This file should be named - \verb|setup_openram_.py| where techname is the name used - to identify it in configuration scripts. -\item Technology-Specific Parameters - These parameters should include - layer numbers and any design rules that may be needed for generating - dynamic designs (DRC rules). The parameters should be added in - \verb|techname/tech/tech.py| and optinally in a \verb|techname/layer.map| for - DRC/LVS streaming. -\item Library Cells - The library cells and corresponding spice - netlists should be added to the \verb|techname/gds_lib| and - \verb|techname/sp_lib| directories. -\item Spice Models - If models are not supplied in the PDK, they can be - placed in the technology directory as done in SCMOS. -\end{itemize} - -The height and width of library cells is determined by the bounding -box of all geometries. Sometimes this is not desired, for example, -when a rail must be shared. In this case, the boundary layer in the -technology file is used to define the height and width of the cell. - -Pins are recognized in library cells by the largest rectangle that -encloses the pin label text. Multiple pins with the same name are -supported. Pins with the same name such as gnd are assumed to be -``must connect'' which requires that they later be connected. - -For more information regarding the technology directory and how to set -one up for a new technology, refer to Section~\ref{sec:porting} - -\subsection{DRC/LVS Interface} -\label{sec:drclvs} - -Each design class contains a function \verb|DRC_LVS()| that performs both -DRC and LVS on the current design module. This enables bottom-up -correct-by-construction design and easy identification of where errors -occur. It does incur some run-time overhead and can be disabled on -the command line. The \verb|DRC_LVS()| function saves a GDSII file and a Spice -file into a temporary directory and then calls two functions to -perform DRC and LVS that are tool-dependent. - -Wrapper implementation for DRC and LVS functions are provided for the -open-source tools Magic+Netgen and the commercial tool, Cadence -Calibre. Each of these functions generates a batch-mode script or runset -file which contains the options to correctly run DRC and LVS. The -functions then parse the batch mode output for any potential errors -and returns the number of errors encountered. - -The function \verb|run_drc()| requires a cell name and a GDSII -file. The cell name corresponds to the top level cell in the GDSII -file. For Calibre, it also uses the layer map file for the technology -to correctly import the GDSII file into the Cadence database to -perform DRC. The function returns the number of DRC violations. - -The function \verb|run_lvs()| requires a cell name, a GDSII file, and -a Spice file. Magic or Calibre will extract an extracted Spice netlist -from the GDSII file and will then compare this netlist with the -OpenRAM Spice netlist. The function returns the number of errors -encountered if there is an LVS mismatch. - - -For both DRC and LVS, the summary file and other report files are left -in the OpenRAM temporary directory after DRC/LVS is run. These report -files can be examined to further understand why errors were -encountered. In addition, by increasing the debug level with one or -more ``-v'' command-line parametres, the command to re-create the -DRC/LVS check can be obtained and run manually. - - - - - diff --git a/docs/intro.tex b/docs/intro.tex deleted file mode 100644 index a83065b9..00000000 --- a/docs/intro.tex +++ /dev/null @@ -1,272 +0,0 @@ -\section{Introduction} -\label{sec:intro} - -The OpenRAM project aims to provide a free, open-source memory -compiler development framework for Random-Access Memories (RAMs). -Most academic Integrated Circuit (IC) design methodologies are -inhibited by the availability of memories. Many standard-cell process -design kits (PDKs) are available from foundries and vendors, but these -PDKs do not come with memory arrays or compilers. Some PDKs have -options to request ``black box'' memory models, but these are not -modifiable, have limited available configurations, and do not have -full details available to academics. These restrictions make -comparison and experimentation with real memory systems impossible. -OpenRAM, however, is user-modifiable and portable through -technology libraries to enable experimentation with real-world -memories at a variety of performance points and costs. - -The specific features of OpenRAM are: -\begin{itemize} - -\item \textbf{Memory Array Generation} - - Currently, OpenRAM includes features such as automatic word-line - driver sizing, efficient decoder sizing, multiple-word column - support, and self-timing with replica bitlines. - -\item \textbf{Portability and Extensibility} - - OpenRAM is a Python program. Python enables portability to numerous - platforms and enables the program to be extended by anyone. In - general, it works on Linux, MacOS, and Windows platforms. - - User-readable technology files enable migration to a variety of - process technologies. Currently, an implementation in a - non-fabricale 45nm technology (FreePDK45) is provided and the MOSIS - Scalable CMOS (SCN3ME\_SUBM.30) is provided. The compiler has also - been extended to several technologies. We hope to work with vendors - to distribute the technology information of others commercial - technologies soon. - - OpenRAM makes calls to both open-source or commercial circuit - simulators and DRC/LVS tools in an abstracted way for circuit - simulation and verification. This enables adaptation to other design - methodologies. It supports a completely open-source - platform for older SCMOS technologies. - -\item \textbf{Timing and Power Characterization} - - OpenRAM provides a basic framework for analysis of timing and power. - This includes both analytical estimates, un-annotated spice - simulations, or back-annotated simulations. The timing and power - views are provided in the Liberty open format for use with the most - common logic synthesis and timing analysis tools. - -\item \textbf{Commercial Tool Independence and Interoperability} - - To keep OpenRAM portable and maximize its usefulness, it it - independent from any specific commercial tool suite or - language. OpenRAM interfaces to both open-source (e.g., NGSpice) and - commercial circuit simulators through the standard Spice3 circuit - format. The physical layout is directly generated in the GDSII - layout stream format which can be imported into any academic or - commercial layout tools. We provide a Library Exchange Format (LEF) - file for interfacing with commercial Placement and Routing tools. - We provide a Verilog behavioral model for simulation. - -\item \textbf{Silicon Verification} - TBD - -\end{itemize} - -\subsection{Requirements} - -Development is done on Ubuntu or MacOS systems with Python 2.7. It -requires a few common Python libraries such as numpy, scipy (soon, for -optimization) along with standard Python libraries (os, sys, etc.). - - -\subsubsection{Timing Verification Tools} - -For peformance reasons, OpenRAM uses analytical delay models by -default. If you wish to enable simulation-based timing -characterization, you must enable this on the command line with the -``-c'' command line argument. - -% Not complete yet -%If you wish to perform back-annotated characterization, you must -%further enable this with the ``-b'' command line argument. - -OpenRAM can use the following circuit simulators and possibly others -if they support the Spice3 file format: -\begin{itemize} - \item HSpice I-2013.12-1 or later - \item ngspice 26 \url{http://ngspice.sourceforge.net/} - \item CustomSim (xa) M-2017.03-SP5 or later -\end{itemize} - -\subsubsection{Physical Verification Tools} - -By default, OpenRAM will perform DRC and LVS on each level of -hierarchy. To do this, you must have a valid DRC and LVS tool and the -corresponding rule files for the technology. OpenRAM can, however, -run without DRC and LVS verification using the ``-n'' command line -argument. It is not recommended to use this if you make any changes, -however. - -DRC can be done with: -\begin{itemize} -\item Calibre 2012.3\_15.13 or later (SCMOS or FreePDK45) -\item Magic \url{http://opencircuitdesign.com/magic/} (SCMOS only) -\end{itemize} - -LVS can be done with: -\begin{itemize} -\item Calibre 2012.3\_15.13 or later (SCMOS or FreePDK45) -\item Netgen \url{http://opencircuitdesign.com/netgen/} (SCMOS only) -\end{itemize} - -\subsubsection{Technology Files} - -To work with FreePDK45, you must install the FreePDK baseline kit from:\\ -\url{https://www.eda.ncsu.edu/wiki/FreePDK45:Contents} - -We have included an example Calibre DRC deck for MOSIS SCMOS design -rules, but DRC with Magic relies on the MOSIS scalable design -rules:\\ -\url{https://www.mosis.com/files/scmos/scmos.pdf}.\\ -We require the format 32 or later to enable stacked vias which is -included with Qflow: -\begin{verbatim} -git clone http://opencircuitdesign.com/qflow -cp tech/osu050/SCN3ME_SUBM.30.tech -\end{verbatim} - -You can over-ride the location of the DRC and LVS rules with the -DRCLVS\_HOME environment variable. - -\subsubsection{Spice Models} - -FreePDK45 comes with a spice device model. Once this is installed and -the PDK\_DIR environment variable for FreePDK45 is set, these spice -models are used. - -SCMOS, however, does not come with a device spice model. This must be -obtained from MOSIS or another vendor. We use the ON Semiconductor -0.5um device models, but are unable to distribute them. We have included our -own generic spice models for simulation of SCMOS, but we recommend that -you replace these with more accurate foundry models. - -You can over-ride the location of the spice models with the -SPICE\_MODEL\_DIR environment variable to ensure that they do not -``creep'' into the OpenRAM git repository. - - - -\subsection{Environment Variables} - -In order to make OpenRAM flexible, it uses two environment variables -to make it relocatable in a variety of user scenarios. Specifically, -the user may want technology directories that are separate from -OpenRAM. Or, the user may want to have several versions of -OpenRAM. This is done with the folowing required environment -variables: -\begin{itemize} -\item OPENRAM\_HOME defines the location of the compiler source directory. -\item OPENRAM\_TECH defines the location of the OpenRAM technology - files. This is discussed later in Section~\ref{sec:tech}. -\end{itemize} - -Other environmental variables and additional required paths for -specific technologies are dynamically added during runtime by sourcing -a technology setup script. These are mostly PDK-specific. These are located in the -"\$OPENRAM\_TECH/setup\_scripts" directory. Example scripts for SCMOS and -FreePDK45 are included with the distribution. - - -%\subsection{Design Flow} - -%% % high-level org - -%% The memory compiler framework is divided into several modules: the -%% compiler, the router, the characterizer, verify, and gdsMill. -%% Figure~\ref{fig:methodology} shows an overview of the methodology. The -%% compiler input is the memory organization with which it generates the -%% logical and layout views. The compiler then uses these views while -%% calling the characterization tool to ensure functionality and measure -%% timing/power. The characterization tool indirectly calls a spice -%% simulator for timing/power analysis. - -%% % front-end - -%% The ``front-end'' methodology can be run with no verification tools (spice, DRC, or LVS). -%% only a spice simulator -%% and will produce Spice models (eventually Verilog), layout/GDSII -%% (eventually LEF), and a timing/power model based on estimated -%% parasitics. It is intended that this mode be easily run on any -%% platform so that designers and architects can get timing, power and -%% area estimates quickly. - -%% % back-end - -%% The ``back-end'' methodology uses the spice netlist and detailed layout -%% generated by the front-end to perform back-annotated characterization -%% and generate annotated timing and power models. The back-end uses -%% layout directly in the GDSII stream format which is supported in both -%% commercial and academic back-end flows. The back-end mode is to be used -%% prior to fabrication and by designers who want detailed timing/power -%% values. - -%% In both the front-end and back-end flows, the designs are Design Rule -%% Checked (DRC) and Layout Verses Schematic (LVS) checked at each level -%% of design hierarchy. - -\subsection{Usage} - -The OpenRAM compiler requires a single argument of a configuration -file. The configuration file specifies, at a minimum, the memory size -parameters in terms of the number of words, word size (in bits), and -number of banks. By default, OpenRAM will chose the number of columns -to make the memory reasonably square. Other common configuration -parameters are the output path and base filename, characterization -corners (including the supply voltage), number of ports, technology -node, etc. - -The configuration file can be used to over-ride any option in the -options.py file. Many of these can also be controlled by the command-line -which over-ride the configuration file. - -The one exception is the technology name. The technology name of a -config file will over-ride a command-line option. The unit tests use -the command line to read a configuration file, so it is a chicken and -egg situation. - -Lastly, the configuration file can over-ride any of the different -circuit implementations for each module. For example, you can replace -the default address decoder or bitcell with a new one by specifying a -new python module that implements a new one. - -An entire example configuration file looks like: -\begin{verbatim} -word_size = 16 -num_words = 32 -num_banks = 1 - -tech_name = "freepdk45" - -output_path = "/tmp/outputdir" -output_name = "mysram" - -bitcell = "custom_bitcell" -\end{verbatim} -In this example, the user has specified a custom bitcell that will be -used when creating the bitcell\_array and other modules. - -OpenRAM has many command line arguments. Other useful command line arguments are: -\begin{itemize} -\item -h : To get help for the command-line options -\item -v : To increase the verbosity (may be used multiple times) -\end{itemize} - -\begin{figure}[tb] -\centering -\includegraphics[width=14cm]{./figs/methodology.pdf} -\caption{Overall Compilation and Characterization Methodology -\label{fig:methodology}} -\end{figure} - - - - - - diff --git a/docs/modules.tex b/docs/modules.tex deleted file mode 100644 index a232cd1f..00000000 --- a/docs/modules.tex +++ /dev/null @@ -1,601 +0,0 @@ -\section{Modules} -\label{sec:modules} - -This section provides an overview of the main modules that are used in -an SRAM. For each module, we will provide both an architectural -description and an explanation of how that design is generated and -used in OpenRAM. The modules described below are provided in the -first release of OpenRAM, but by no means is this an exhaustive list -of the possible circuits that can be adapted into a SRAM architecture; -refer to Section~\ref{sec:implementation} for more information on -adding different module designs to the compiler. - -Data structures for schematic and layout are provided in the -\verb|base| directory. These implement a generic design object and -have many auxiliary functions for routing, pin access, placement, -DRC/LVS, etc. These are discussed further in -Section~\ref{sec:implementation}. - -Each module has a corresponding Python class in the -\verb|compiler/modules| directory. These classes are used to generate -both the GDSII layout and spice netlists. A module can consist of -hard library cells (Section~\ref{sec:techdir}), paramterized -cells (Section~\ref{sec:parameterized}) or other modules. - -When combining modules at any level of hierarchy, DRC rules for -minimum spacing of metals, wells, etc. must be followed and DRC and -LVS are run by default after each hierarchical module's creation. A -module is responsible for creating its own pins to enable routing -at the next level up in the hierarchy. A module must also define its -height and width assuming a (0,0) offset for the lower-left coordinate -to aid with placement. - - -\subsection{The Bitcell and Bitcell Array} -\label{sec:bitcellarray} - -OpenRAM can work with any cell as the bitcell. This could be a foundry -created one or a user design rule cell for experiments. In addition, -it could be a common 6T cell or it could be replaced with an 8T, 10T -or other cell, depending on needs. - -By default, OpenRAM uses a standard 6T cell as shown in -Figure~\ref{fig:6t_cell}. The cross coupled inverters hold a single -data bit that can either be driven into, or read from the cell by the -bitlines. The access transistors are used to isolate the cell from -the bitlines so that data is not corrupted while a cell is not being -accessed. - -\begin{figure}[h!] -\centering -\includegraphics[scale=.9]{figs/cell_6t_schem.pdf} -\caption{Standard 6T cell.} -\label{fig:6t_cell} -\end{figure} - -% tiling memory cells -The 6T cells are tiled together in both the horizontal and vertical -directions to make up the memory array. - -% keeping it square -It is common practice to keep the aspect ratio of a memory array -roughly ``square'' to ensure that the bitlines and wordlines do not -become too long. If the bitlines are too long, this can increase the -bitline capacitance, slow down the operation and lead to bitline -leakage problems. To make an array ``more square'', multiple words -can share rows by interleaving the bits of each word. The column mux -in Section~\ref{sec:column_mux} is responsbile for selecting a subset -of bitcells in a row to extract a word during read and write -operations. - -% memory cell is a library cell -In OpenRAM, we provide a library cell for the 6T cell that can be -swapped with a fab memory cell, if available. The transitors in the -cell are sized appropriately considering read and write noise margins. - -% bitcell and bitcell_array classes -The bitcell class in \verb|modules/bitcell.py| is a single -memory cell and is usually a pre-made library cell. - -% bitcell_array -The bitcell\_array class in \verb|modules/bitcell_array.py| dynamically -implements the memory cell array by instantiating a the bitcell class -in rows and columns. - -% abutment connections -During the tiling process, bitcells are abutted so that all bitlines -and word lines are connected in the vertical and horizontal directions -respectively. This is done by using the boundary layer to define the -height and width of the cell. If this is not specified, OpenRAM will -use the bounding box of all shapes as the boundary. The boundary layer -should be offset at (0,0) in the lower left coordinate. - -% flipping -In order to share supply rails, bitcells are flipped in alternating -rows. - - - -\subsection{Precharge Circuitry} -\label{sec:precharge} - -The precharge circuit is depicted in Figure~\ref{fig:precharge} and is -implemented by three PMOS transistors. The input signal to the cell, -clk, enables all three transistors during the first half of a read or -write cycle (i.e. while the clock signal is low). M1 and M2 charge bl -and br to vdd while M3 equalizes the voltages seen between the bitlines. - -\begin{figure}[h!] -\centering -\includegraphics[width=5cm]{./figs/precharge_schem.pdf} -\caption{Schematic of a precharge circuit.} -\label{fig:precharge} -\end{figure} - -In OpenRAM, the precharge citcuitry is dynamically generated using the -parameterized transistor class ptx which is further discussed in -Section~\ref{sec:ptx}. The offsets of the bitlines and the width of -the precharge cell are equal to the bitcell so that the bitlines are -correctly connected by abutment. The precharge class in -\verb|modules/precharge.py| dynamically generates a single precharge -cell. - -\verb|modules/precharge_array.py| creates a row of precharge cells at -the top of a bitcell array. - - - - -\subsection{Address Decoders} -\label{sec:address_decoder} - -The address decoder deodes the binary-encoded row address bits from the -address bus as inputs, and asserts a one-hot wordline in the row that -data is to be read or written. OpenRAM provides a hierarchical address -decoder as the default, but will soon have other options. - -The address decoders are created using parameterized gates (pnand2, -pnand3, pinv) and transistors (ptx). This means that the decoders do -not rely on any hard library cells. - -\subsubsection{Hierarchical Decoder} -\label{sec:hierdecoder} - - -A simple 2:4 decoder is shown in Figure~\ref{fig:2:4decoder}. This -decoder computes all of the possible decode values using a single -level of nand gates along with the inverted and non-inverted inputs. -As the decoder size increases the size of the nand gates required for -decoding would increase proportional to the bits to be decoded. This -would not be practical for large decoders. - - -\begin{figure}[h!] -\centering -\includegraphics[scale=.6]{./figs/2t4decoder.pdf} -\caption{Schematic of 2-4 simple decoder.} -\label{fig:2:4decoder} -\end{figure} - -A hierarchical decoder uses two-levels of decoding hierarchy to -perform an address decode. The first stage computes predecoded values -while the second stage computes the final decoded values. -Figure~\ref{fig:4 to 16 decoder} shows a 4:16 heirarchical -decoder. The decoder uses two 2:4 decoders for -predecoding and 2-input nand gates and inverters for final decoding to -form the 4:16 decoder. - -\begin{figure}[h!] -\centering -\includegraphics[scale=.6]{./figs/4t16decoder.pdf} -\caption{Schematic of 4:16 hierarchical decoder.} -\label{fig:4 to 16 decoder} -\end{figure} - -The predecoder generates a total of 8 intermediate signals from the -address bits and their complements. These intermediate signals are in -two groups of 4 from each decoder. The enumeration of all 4 x 4 -predecoded values are used by the final decode to produce the 16 -decoded results. As an example, Table~\ref{table:4-16 hierarchical_decoder} -gives the detailed input and output siganls for the 4:16 hierarchical -decoder. - - - \begin{table}[h!] - \begin{center} - \begin{tabular}{| c | c | c | c |} - \hline - A[3:0] & predecoder1 & predecoder2 & Selected WL\\ \hline - 0000 & 1000 & 1000 & 0\\ \hline - 0001 & 1000 & 0100 & 1\\ \hline - 0010 & 1000 & 0010 & 2\\ \hline - 0011 & 1000 & 0001 & 3\\ \hline - 0100 & 0100 & 1000 & 4\\ \hline - 0101 & 0100 & 0100 & 5\\ \hline - 0110 & 0100 & 0010 & 6\\ \hline - 0111 & 0100 & 0001 & 7\\ \hline - 1000 & 0010 & 1000 & 8\\ \hline - 1001 & 0010 & 0100 & 9\\ \hline - 1010 & 0010 & 0010 & 10\\ \hline - 1011 & 0010 & 0001 & 11\\ \hline - 1100 & 0001 & 1000 & 12\\ \hline - 1101 & 0001 & 0100 & 13\\ \hline - 1110 & 0001 & 0010 & 14\\ \hline - 1111 & 0001 & 0001 & 15\\ \hline - \end{tabular} - \end{center} - \caption{Truth table for 4:16 hierarchical decoder.} - \label{table:4-16 hierarchical_decoder} - \end{table} - - -As the address size increases, additional sizes of pre- and final -decoders can be used. In OpenRAM, there are implementations for -\verb|modules/hierarchical\_predecode2x4.py| and -\verb|modules/hierarchical\_predecode3x8.py| to produce 2:4 and 3:8 -predecodes, respectively. These same decoders are used to generate the -column mux select bits as well. - -For the final decode, we can use either pnand2 or pnand3 gates. This -allows a maximum size of three 3:8 predocers along with a final pnand3 decode -stage, or, 512 word lines. To extend beyond this, a pnand4 or -a 4:16 predecoder would be needed. - - -\subsection{Wordline Driver} -\label{sec:wldriver} - -The word line driver buffers the address decoder to drive the wordline and -gates the signal until the decode has stabilized. Without waiting, an -incorrectly asserted wordline could erase memory contents. -The word line driver is sized according to the bitcell array width so -that wordlines in larger memory arrays can be appropriately driven. - -% gating for first half decode, second half read/write -The first half of the clock cycle is used for address decoding in -OpenRAM. Therefore, the wordline driver is enabled in the second half -of the clock cycle in OpenRAM. The buffered clock signal drives each -wordline driver row and is logically ANDed with the decoder output. - -% bank clock gating for wordline driver -In multi-bank structures the clock buffer is also anded with the bank -select signal to prevent the read/writing of an entire bank. - -\begin{figure}[h!] -\centering -\includegraphics[scale=.6]{./figs/wordline_driver.pdf} -\caption{Diagram of word line driver.} -\label{fig:wordline_driver} -\end{figure} - -Figure~\ref{fig:wordline_driver} illustrates the wordline driver and -its inputs/outputs. This is implemented in the -\verb|modules/wordline_driver.py| module and matches the number of -rows in the bitcell array of a bank. - -OpenRAM creates the wordline drivers using the parameterized pinv and -pnand2 classes. This enables the wordline driver to be matched to the -bitcell height and to sized to drive the wordline load. - - - -\subsection{Column Mux} -\label{sec:column_mux} -The column mux is an optional module in an SRAM bank. Without a column -mux, the bank is assumed to have a single word in each row. A column -mux enables more more than one word to be stored in each row and -read/written individually. The column mux is used for both the read -and write operations by connecting the bitlines of a bank to -both the sense amplifier and the write driver. - -In OpenRAM, the column mux uses the {\bf high address bits} to select -the appropriate word in each row. If n-bits are used, there are $2^n$ -words in each row. OpenRAM currently allows 2, 4, or 8 words per row, -but the 8 words are not fully debugged (as of 2/12/18). - -%% OpenRAM provides several options for column mux, but the default -%% is a single-level column mux which is sized for optimal speed. - -%% \subsubsection{Tree\_Decoding Column Mux} -%% \label{sec:tree_decoding_column_mux} - -%% The schematic for a 4-1 tree -%% multiplexer is shown in Figure~\ref{fig:colmux}. - -%% \begin{figure}[h!] -%% \centering -%% \includegraphics[scale=.9]{./figs/tree_column_mux_schem.pdf} -%% \caption{Schematic of 4-1 tree column mux that passes both of the bitlines.} -%% \label{fig:colmux} -%% \end{figure} - -%% \fixme{Shading/opacity is different on different platforms. Make this a box in the image. It doesn't work on OSX.} - -%% This tree mux selects pairs of bitlines (both BL and BL\_B) as inputs -%% and outputs. This 4-1 tree mux illustrates the process of choosing -%% the correct bitlines if there are 4 words per row in the memory array. -%% Each bitline pair represents a single bit from each word. A binary -%% reduction pattern, shown in Table~\ref{table:colmux}, is used to -%% select the appropriate bitlines. As the number of words per row in -%% the memory array increases, the depth of the column mux grows. The -%% depth of the column mux is equal to the number of bits in the column -%% address bus. The 4-1 tree mux has a depth of 2. In level 1, the -%% least significant bit from the column address bus selects either the -%% first and second words or the third and fourth words. In level 2, the -%% most signifant column address bit selects one of the words passed down -%% from the previous level. Relative to other column mux designs, the -%% tree mus uses significantly less devices. But, this type of design -%% can provide poor performance if a large decoder with many levels are -%% needed. The delay of of a tree mux quadratically increases with each -%% level. Due to this fact, other types of column -%% decoders should be considered for larger arrays. - -%% \begin{table}[h!] -%% \begin{center} -%% \begin{tabular}{| c | c | c | c |} -%% \hline -%% Selected BL & Inp1 & Inp2 & Binary\\ \hline -%% BL0 & SEL0\_bar & SEL1\_bar & 00\\ \hline -%% BL1 & SEL0 & SEL1\_bar & 01\\ \hline -%% BL2 & SEL0\_bar & SEL1 & 10\\ \hline -%% BL3 & SEL0 & SEL1 & 11\\ -%% \hline -%% \end{tabular} -%% \end{center} -%% \caption{Binary reduction pattern for 4-1 tree column mux.} -%% \label{table:colmux} -%% \end{table} - -%% In OpenRAM, the tree column mux is a dynamically generated design. The -%% \verb|tree_mux_array| is made up of two dynamically generated cells: \verb|muxa| -%% and \verb|mux_abar|. The only diffference between these cells is that input -%% select signal is either hooked up to the \textbf{SEL} or -%% \textbf{SEL\_bar} signals (see highlighted boxes in -%% Figure~\ref{fig:colmux}). These cells are initialized the the -%% \verb|column_muxa| and \verb|column_muxabar| classes in \verb|columm_mux.py|. Instances -%% of \verb|ptx| PMOS transistors are added to the design and the necessary -%% routing is performed using the \verb|add_rect()| function. A horizontal rail -%% is added in metal2 for both the SEL and Sel\_bar signals. Underneath -%% those input rails, horizontal straps are added. These straps are used -%% to connect the BL and BL\_B outputs from \verb|muxa| to the BL and BL\_B -%% outputs of \verb|mux_abar|. Vertical conenctors in metal3 are added at the -%% bottom of the cell so that connections can be made down to the sense -%% amp. Vertical connectors are also added in metal1 so that the cells -%% can connect down to other mux cells when the depth of the tree mux is -%% more than one level. - -%% The \verb|tree_mux_array| class is used to generate the tree mux. -%% Instances of both the \verb|muxa| and \verb|mux_abar| cells are instantiated and -%% are tiled row by row. The offset of the cell in a row is determined -%% by the depth of that row in the tree mux. The pattern used to -%% determine the offset of the mux cells is -%% $muxa.width*(i)*(2*row\_depth)$ where is the column number. As the -%% depth increases, the mux cells become further apart. A separate -%% ``for'' loop is invoked if the $depth>1$, which extends the -%% power/ground and select rails across the entire width of the array. -%% Similarly, if the $depth>1$, spice net names are created for the -%% intermediate connection made at the various levels. This is necessary -%% to ensure that a correct spice netlist is generated and that the -%% input/output pins of the column mux match the pins in the modules that -%% it is connected to. - - -\subsubsection{Single-Level Column Mux} -\label{sec:single_level_column_mux} - -OpenRAM includes a single-level pass-gate mux implemtation for the -column mux. A single level of NMOS devices is driven by either the -input address (and it's complement) or decoded input addresses using a -2:4 predecoder (Section~\ref{sec:hierdecoder}). - -Figure~\ref{fig:2t1_single_level_column_mux} shows the schematic of a -2:1 single-level column mux. In this column mux, the {\bf MSB of the - address bus} and it's complement drive the pass transistors. - -Figure~\ref{fig:4t1_single_level_column_mux} shows the schematic of a -4:1 single-level column mux. The select bits are decoded from the {\bf - 2 MSB of the address bus} using a 2:4 decoder. The 2:4 decoder -provides one-hot select signals to select one column. - -In OpenRAM, one mux, single\_level\_mux, is dynamically generated in -\verb|modules/single_level_column_mux.py| and multiple of these muxes -are tiled together in \verb|modules/single_level_column_mux_array.py|. - -single\_level\_mux uses the parameterized ptx (Section~\ref{sec:ptx} -to generate 2 or 4 NMOS transistors for each the bl and br -bitlines. Horizontal rails are added for the $sel$ signals. The -bitlines are automatically pitch-matched to the bitcell array. - - -\begin{figure}[h!] -\centering -\includegraphics[scale=.5]{./figs/2t1_single_level_column_mux.pdf} -\caption{Schematic of a 2:1 single level column mux. \fixme{Signals names are wrong.}} -\label{fig:2t1_single_level_column_mux} -\end{figure} - - - -\begin{figure}[h!] -\centering -\includegraphics[scale=.5]{./figs/4t1_single_level_column_mux.pdf} -\caption{Schematic of a 4:1 single level column mux. \fixme{Signals names are wrong.}} -\label{fig:4t1_single_level_column_mux} -\end{figure} - - -\subsection{Sense Amplifier} -\label{sec:senseamp} -The sense amplifier is used to sense the difference between the -bitline and bitline bar while a read operation is performed. -The sense amplifier also includes two PMOS transistors for bitline -isolation to speed-up read operations. The schematic for the sense amp is shown in -Figure~\ref{fig:sense_amp}. - -\begin{figure}[h!] -\centering -\includegraphics[scale=.8]{./figs/sense_amp_schem.pdf} -\caption{Schematic of a single sense amplifier cell.} -\label{fig:sense_amp} -\end{figure} - -During address decoding (while the wordline is not asserted), the sense -amplifier is disabled and the bitlines are precharged to vdd by the -precharge unit. The two PMOS transistors also connect the bitlines to the sense amplifier. - -The en signal comes from the control logic (Section~\ref{sec:control}) -including the timing and replica bitline (Section~\ref{sec:RBL}). It -is only enabled after sufficient swing is seen on the bitlines so that -the value can be accurately sensed. - -The sense amplifier is enabled by the en signal, which initiates the -read operation, and also isolates the sense amplifier from the -bitlines. This allows the sense amplifier to drive a smaller -capacitance rather than the whole bitline. At this time, the footer -transistor is also enabled which allows the sense amplifier to use -feedback to sense the bitline differential voltage. - -When the sense amp is enabled, one of the bitlines experiences a -voltage drop based on the value stored in the memory cell. If a zero -is stored, the bitline voltage drops. If a one is stored, the bitline -bar voltage drops. The output signal is then -taken to a true logic level and latched for output to the data bus. - -In OpenRAM, the sense amplifier is a libray cell. The associated -layout and spice netlist can be found in the \verb|gds_lib| and -\verb|sp_lib| in the technology directory. The sense\_amp class in -\verb|modules/sense_amp.py| is a single instance of the sense amp -library cell. - - -The sense\_amp\_array class in \verb|modules/sense_amp_array.py| -handles the tiling of the sense amps cells. One sense amp cell is -needed per data bit and the sense amp cells need to be appropriately -spaced so that they can hook up to the column mux bitline pairs. The -spacing is determined based on the number of words per row in the -memory array. - -The sense amp is a library cell so that custom -amplifier designs could be swapped into the memory as needed. The two -major things that need to be considered while designing the sense -amplifier cell are the size of the cell and the bitline/input pitches. -Optimally, the cell should be no wider than the 6T cell so that it -abuts to the column mux and no extra routing or space is needed. -Also, the bitline inputs of the sense amp need to line up with the -outputs of the write driver. In the current version of OpenRAM, the -write driver is situated under the sense amp, which had bitlines -spaning the entire height of the cell. In this case, the sense -amplifier is disabled during a write operation but the bitlines still -connect the write driver to the column mux without any extra routing. - - -\subsection{Write Driver} -\label{sec:writedriver} - -The write driver is used to drive the input signal into the memory -cell during a write operation. It can be seen in -Figure~\ref{fig:write_driver} that the write driver consists of two -tristate buffers, one inverting and one non-inverting. It takes in a -data bit, from the data bus, and outputs that value on the bitline, -and its complement on bitline bar. The bitlines need to be -complements so that the data value can be correctly stored in the 6T -cell. Both tristates are enabled by the EN signal. - -\begin{figure}[h!] -\centering -\includegraphics[scale=.8]{./figs/write_driver_schem.pdf} -\caption{Schematic of a write driver cell, which consists of 2 tristates (non-inverting and inverting) to drive the bitlines.} -\label{fig:write_driver} -\end{figure} - -Currently, in OpenRAM, the write driver is a library cell. The -associated layout and spice netlist can be found in the \verb|gds_lib| and -\verb|sp_lib| in the FreePDK45 directory. Similar to the \verb|sense_amp_array|, -the \verb|write_driver_array| class tiles the write driver cells. One -driver cell is needed per data bit and Vdd, Gnd, and EN signals must -be extended to span the entire width of the cell. It is not optimal to -have the write driver as a library cell because the driver needs to be -sized based on the capacitance of the bitlines. A large memory array -needs a stronger driver to drive the data values into the memory -cells. We are working on creating a parameterized tristate class, -which will dynamically generate write driver cells of different -sizes/strengths. - -\subsection{Flip-Flop Array} - -In a synchronous SRAM it is necessary to synchronize the inputs and -outputs with a clock signal by using flip-flops. In FreePDK45 we -provide a library cell for a simple master-slave flip-flop, see -schematic in Figure~\ref{fig:ms_flop}. In our library cell we provide -both Q and Q\_bar as outputs of the flop because inverted signals are -used in various modules. The \verb|ms_flop| class in \verb|ms_flop.py| -instatitates a single master-slave flop, and the \verb|ms_flop_array| class -generates an array of flip-flops. Arrays of flops are necessary for -the data bus (an array for both the inputs and outputs) as well as the -address bus (an array for row and column inputs). The \verb|ms_flop_array| -takes the number of flops and the type of array as inputs. Currently, -the type of the array must be either ``data\_in'', ``data\_out'', -``addr\_row'', or ``addr\_col'' verbatim. The array type input is -used to look up that associated pin names for each of the flop arrays. -This was implemented very quickly and should be improved in the near -future... - -\begin{figure}[h!] -\centering -\includegraphics[scale=.7]{./figs/ms_flop_schem.pdf} -\caption{Schematic of a master-slave flip-flop provided in FreePDK45 library} -\label{fig:ms_flop} -\end{figure} - -\subsection{Control Logic} - -The details of the control logic architecture are outlined in -Section~\ref{sec:control}. The control logic module, -\verb|control_logic.py|, instantiates a \verb|control_logic| class that arranges -all of the flip-flops and logic associated with the control signals -into a single module. Flip-flops are instantiated for each control -signal input and library NAND and NOR gates are used for the logic. A -delay chain, of variable length, is also generted using parameterized -inverters. The associated layouts and spice netlists can be found in -the \verb|gds_lib| and \verb|sp_lib| in the FreePDK45 directory. - -\section{Bank and SRAM} -\label{sec:bank} - -The overall memory architecture is shown in figure~\ref{fig:bank}. -As shown in this figure one Bank contains different modules including -precharge-array which is positioned above the bitcell-array, -column-mux-array which is located below the bitcell-array, -sense-amp-array, write-driver-array, data-in-ms-flop-array -to synchronize the input data with negative edge of the clock, -tri-gata-array to share the bidirectional data-bus between input -and output data, hierarchical decoder which is placed on the right side -of the bitcell-array (predecoder + decoder), wordline-driver which drives -the wordlines horizontally across the bitcell-array and address-ms-flops -to synchronize the input address with positive edge of the clock. - -In bitcell-array each memory cell is mirrored vertically and horizontally inorder to share VDD and GND rails with adjacent cells and form the array. -Data-bus is connected to tri-gate, address-bus is connected to address-ms-flops and bank-select -signal will enable the bank when it goes high. To complete the SRAM design, bank is connected to control-logic as shown in figure~\ref{fig:bank}. -Control-logic controls the timing -of modules inside the bank. CSb, OEb, Web and clk are inputs to the control logic and output of -control logic will ANDed with bank-select signal and send to the corresponding modules. - - -\begin{figure}[h!] -\centering -\includegraphics[scale=1]{./figs/bank.pdf} -\caption{Overal bank and SRAM architecture.} -\label{fig:bank} -\end{figure} - - -In order to reduce the delay and power, divided wordline strategy have been used in this compiler. Part of the address bits -are used to define the global wordline (bank-select) and rest of address bits are connected to hierarchical -decoder inside each bank to generate local wordlines that actually drive the bitcell access transistors. - -As shown in figure~\ref{fig:bank2} SRAM is divided to two banks which share data-bus, address-bus, control-bus and control-logic. -In this case one bit of address (most significant bit) goes to an ms-flop and outputs of ms-flop (address-out and address-out-bar) -are connected to banks as bank-select signals. Control logic is shared between two banks and based on which bank is selected, -control signals will activate modules inside the selected bank. In this architecture, the total cell capacitance is reduced by up -to a factor of two. Therefore the power will be reduced greatly and the delay among the wordlines is also reduced. - -\begin{figure}[h!] -\centering -\includegraphics[scale=.9]{./figs/bank2.pdf} -\caption{SRAM is divided to two banks which share the control-logic.} -\label{fig:bank2} -\end{figure} - -In figure~\ref{fig:bank4}, four banks are connected together. In this case a 2:4 decoder is added to select one of the banks using two -most significant bits of input address. Control signals are connected to all banks but will turn on only the selected bank. - - -\begin{figure}[h!] -\centering -\includegraphics[scale=.9]{./figs/bank4.pdf} -\caption{SRAM is divided to 4 banks wich are controlled by the control-logic and a 2:4 decoder.} -\label{fig:bank4} -\end{figure} - - diff --git a/docs/openram_manual.pdf b/docs/openram_manual.pdf deleted file mode 100644 index 08d4b461..00000000 Binary files a/docs/openram_manual.pdf and /dev/null differ diff --git a/docs/openram_manual.tex b/docs/openram_manual.tex deleted file mode 100644 index 32dfc3be..00000000 --- a/docs/openram_manual.tex +++ /dev/null @@ -1,108 +0,0 @@ -% The % is a comment. This file is an Example LaTeX document for GP111 -\documentclass[11pt]{article} -\usepackage{times} % LaTeX 2e -\usepackage{graphicx} -\usepackage{epstopdf} -%\usepackage{subfigure} -\usepackage[colorlinks=true]{hyperref} -%\usepackage[doublespacing]{setspace} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% Generic Shared across papers Keywords - -\newcommand{\fixme}[1]{{\Large FIXME:} {\bf #1}} -\newcommand{\note}[1]{{\bf Note:} \{\uline{#1}\}\\} - -% create some additional spacing between paragraphs. -\setlength{\parskip}{7pt} -% Default margins are too wide all the way around. I reset them here. -\setlength{\topmargin}{-.5in} -\setlength{\textheight}{9in} -\setlength{\oddsidemargin}{.125in} -\setlength{\textwidth}{6.25in} - -\begin{document} - -\title{OpenRAM Manual} -\author{Matthew R. Guthaus - mrg@ucsc.edu\\ - and many others -} -%\renewcommand{\today}{October 14, 2010} -\maketitle -\newpage -\section{License} - -\begin{verbatim} - Copyright 2018 Regents of the University of California and The Board - of Regents for the Oklahoma Agricultural and Mechanical College - (acting for and on behalf of Oklahoma State University) - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are - met: - - 1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - 3. Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -\end{verbatim} - - -\newpage -\setcounter{tocdepth}{2} -\tableofcontents - -\newpage - -% Each chapter description -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\input{intro} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\input{overview} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\input{modules} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\input{implementation} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\input{parameterized} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\input{porting} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\input{timing} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\input{unittests} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\input{debug} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%\input{conclusions} -\input{gdsmill} - - -\end{document} diff --git a/docs/overview.tex b/docs/overview.tex deleted file mode 100644 index 89378c80..00000000 --- a/docs/overview.tex +++ /dev/null @@ -1,90 +0,0 @@ -\section{Overview of the SRAM Structure} -\label{sec:overview} - - -% address decode and mem array -The baseline SRAMs generated by OpenRAM have 1 read/write port as -shown in Figure~\ref{fig:sram_architecture}. The address is decoded -(Section~\ref{sec:addressdecoder}) into a one-hot set of word lines -(WL) which are driven by word line drivers -(Section~\ref{sec:wldriver}) over the bit-cell array -(Section~\ref{sec:bitcellarray}). To facilitate reads, the precharge -circuitry (Section~\ref{sec:precharge}) precharges the bitlines so -that the column mux (Section~\ref{sec:column_mux}) can select the -appropriate word which is then sensed by the sense amplifiers -(Section~\ref{sec:senseamp}). Write drivers -(Section~\ref{sec:writedriver}) use the bidirectional nature of the -column mux to write the appropriate columns in a given memory row. - -A representative layout of such a memory closely resembles the logical -representation and is shown in Figure~\ref{fig:layout_view}. The -address and data flip-flops and control circuitry are not shown but -are detailed in Section~\ref{sec:control}. - - -\begin{figure}[htb] -\centering -\includegraphics[width=10cm]{./figs/sram_overview.pdf} -\caption{Single Port SRAM Architecture} -\label{fig:sram_architecture} -\end{figure} - - -\begin{figure}[htb] -\centering -\includegraphics[width=6cm]{./figs/layout_view_1024_16_annotated.pdf} -\caption{1k SRAM with Two Columns and 16-bit Data} -\label{fig:layout_view} -\end{figure} - - - -\subsection{Inputs/Outputs} -\label{sec:io} - -The inputs to the SRAM are: -\begin{itemize} -\setlength{\itemsep}{0pt} -\item clk - External Clock -\item CSb - Active-low Chip Select -\item WEb - Active-low Write Enable -\item OEb - Active-low Output Enable -\item ADDR[\#] - Address Bus input (LSB is 0) -\item DATA[\#] - Bi-directional Data bus (LBS is 0) -\end{itemize} -If multiple ports are used, the ADDR and DATA buses are appended with -integers to extend them. - -The outputs to the SRAM are: -\begin{itemize} -\setlength{\itemsep}{0pt} -\item DATA\# - correspond to the bi-directional Data bus. -\end{itemize} - -The supply voltages to the SRAM are: -\begin{itemize} -\item vdd - Supply voltage -\item gnd - Ground supply voltage -\end{itemize} - -\subsection{Top-Level SRAM Module} -\label{sec:sram} - -The sram class in \verb|sram.py| is the top-level SRAM module. This -class handles the overall organization of the memory, instantiates the -contorl logic, instantiates a number of banks, and creates decoded -enable signals for multiple banks. All of the top level routing is -performed in the sram class. - - -The sram class instantiates identical copies of the bank module from -\verb|bank.py|. All other sub-modules access the value of sizes from -bank. The bank module includes an address decoder, (optional) column -address decoder, (optional) column mux, sense amplifiers, precharge -circuitry, write drivers, etc. A single bank organization is depicted -in Figure~\ref{fig:sram_architecture}. - -Discussion of the design data structure is discussed in -Section~\ref{sec:design} and the modules contained in the top-level -SRAM are detailed in Section~\ref{sec:modules}. - diff --git a/docs/parameterized.tex b/docs/parameterized.tex deleted file mode 100644 index e85670bb..00000000 --- a/docs/parameterized.tex +++ /dev/null @@ -1,258 +0,0 @@ -\section{Custom Layout Design Functions in Software} -\label{sec:parameterized} - -OpenRAM provides classes that can be used to generated parameterized -cells for the most common cells: transistors, inverters, nand2, nand3, etc... -There are many advantages to having parameterized cells. -The main advantage is that it makes it easier to dynamically generate designs and cuts -down the necessary code to be written. -We also need parameterized cells because some designs, such as the wordline drivers, need to be -dynamically sized based on the size of the memory. -Lastly, there may be certain physical dimension requirements that need to be met for a -cell, while still maintaing the expected operation/performance. -In OpenRAM we currently provide five parameterized cells: parameterized -transistor (\verb|ptx|), parameterized inverter (\verb|pinv|), parameterized nand2 (\verb|nand_2|), -parameterized nand3 (\verb|nand_3|) and parameterized nor2 (\verb|nor_2|). - - -\subsection{Parameterized Transistor} -\label{sec:ptx} - -The parameterized transistor class generates a transistor of specified -width and number of mults. -The \verb|ptx| is constructed as follows: -\begin{verbatim} -def __init__(self,name,width,mults,tx_type) -\end{verbatim} - -An explanation of the \verb|ptx| parameters is shown in -Table~\ref{table:ptx_params}. A layout of ptx, generated by the -following instatiation, is depicted in Figure~\ref{fig:ptx_example}. -\begin{verbatim} -fet = ptx.ptx(name = "nmos_1_finger", width = tech.drc["minwidth_tx"], -mults = 1, tx_type = "nmos"). -\end{verbatim} - -\begin{table}[h!] - \begin{center} - \begin{tabular}{| l | c |} - \hline - Parameter & Explanation \\ \hline - \verb|width| & active\_height \\ \hline - \verb|mults| & mult number of the transistor \\ \hline - \verb|tx_type| & type of transistor,”nmos” and “pmos” \\ \hline - \hline - \end{tabular} - \end{center} - \caption{Parameter Explanation of ptx} - \label{table:ptx_params} -\end{table} - - -\begin{figure}[h!] -\centering -\includegraphics[width=10cm]{./figs/ptx.pdf} -\caption{An example of Parameterized Transistor (ptx)} -\label{fig:ptx_example} -\end{figure} - - - -\subsection{Parameterized Inverter} -\label{sec:pinv} - -The parameterized inverter (\verb|pinv|) class generated an inverter -of a specified size/strength and height. The \verb|pinv| is -constructed as follows: -\begin{verbatim} -def __init__(self, cell_name, size, beta=tech.[pinv.beta], -cell_size=tech.cell[height]) -\end{verbatim} - -The parameterized inverter can provide significant drive strength -while adhering to physical cell size limitations. That is achieved by -having many small transistors connected in parallel, thus the height -of the inverter cell can be manipulated without the affecting the -drive strength. The NMOS size is an input parameter, and the PMOS size -will be determined by $beta*NMOS\_size$, where beta is the ratio of -the PMOS channel width to the NMOS channel width. The following code -instatiates the \verb|pinv| instance seen in Figure~\ref{fig:pinv}. -\begin{verbatim} -a=pinv.pinv(cell_name="pinv",size=tech.drc["minwidth_tx"]*8) -\end{verbatim} -\begin{figure}[h!] -\centering -\includegraphics[width=10cm]{./figs/pinv.pdf} -\caption{An example of Parameterized Inverter(pinv)} -\label{fig:pinv} -\end{figure} - - -The \verb|pinv| parameters are explained in Table~\ref{table:pinv_params}. -\begin{table}[h!] - \begin{center} - \begin{tabular}{| l | c |} - \hline - Parameter & Explanation \\ \hline - \verb|size| & The logic size of the transistor of the nmos in the pinv \\ \hline - \verb|beta| = tech.[pinv.beta] & Ratio of pmos channel width to nmos channel width. \\ \hline - \verb|cell_size| = tech.cell[height] & physical dimension of cell height. \\ - \hline - \end{tabular} - \end{center} - \caption{Parameter Explanation of pinv} - \label{table:pinv_params} -\end{table} - - - -\subsection{Parameterized NAND2} -\label{sec:nand2} - -The parameterized nand2 (\verb|nand_2|) class generated a 2-input nand gate -of a specified size/strength and height. The \verb|nand_2| is -constructed as follows: -\begin{verbatim} -def __init__(self, name, nmos_width, height=tech.cell_6t[height]) -\end{verbatim} - -The NMOS size is an input parameter, and the PMOS size -will be equal to NMOS to have the equal rising and falling for output. -The following code instatiates the \verb|nand_2| instance seen in Figure~\ref{fig:nand2}. -\begin{verbatim} -a=nand_2.nand_2(name="nand2", nmos_width=2*tech.drc["minwidth_tx"], -height=tech.cell_6t["height"]) -\end{verbatim} - -\begin{figure}[h!] -\centering -%\includegraphics[width=10cm]{./figs/nand2.pdf} -\caption{An example of Parameterized NAND2(nand\_2)} -\label{fig:nand2} -\end{figure} - - -The \verb|nand_2| parameters are explained in Table~\ref{table:nand2_params}. -\begin{table}[h!] - \begin{center} - \begin{tabular}{| l | c |} - \hline - Parameter & Explanation \\ \hline - \verb|nmos_width| & The logic size of the transistor of the nmos in the nand2 \\ \hline - \verb|height| = tech.cell\_6t[height] & physical dimension of cell height. \\ - \hline - \end{tabular} - \end{center} - \caption{Parameter Explanation of nand2} - \label{table:nand2_params} -\end{table} - - - -\subsection{Parameterized NAND3} -\label{sec:nand3} - -The parameterized nand3 (\verb|nand_3|) class generated a 3-input nand gate -of a specified size/strength and height. The \verb|nand_3| is -constructed as follows: -\begin{verbatim} -def __init__(self, name, nmos_width, height=tech.cell_6t[height]) -\end{verbatim} -The NMOS size is an input parameter, and the PMOS size -will be equal to $2/3$ NMOS size to have the equal rising and falling for output. -The following code instatiates the \verb|nand_3| instance seen in Figure~\ref{fig:nand3}. -\begin{verbatim} -a=nand_3.nand_3(name="nand3", nmos_width=3*tech.drc["minwidth_tx"], -height=tech.cell_6t["height"]) -\end{verbatim} - - -\begin{figure}[h!] -\centering -%\includegraphics[width=10cm]{./figs/nand3.pdf} -\caption{An example of Parameterized NAND3(nand\_3)} -\label{fig:nand3} -\end{figure} - -The \verb|nand_3| parameters are explained in Table~\ref{table:nand3_params}. -\begin{table}[h!] - \begin{center} - \begin{tabular}{| l | c |} - \hline - Parameter & Explanation \\ \hline - \verb|nmos_width| & The logic size of the transistor of the nmos in the nand3 \\ \hline - \verb|height| = tech.cell\_6t[height] & physical dimension of cell height. \\ - \hline - \end{tabular} - \end{center} - \caption{Parameter Explanation of nand3} - \label{table:nand3_params} -\end{table} - - -\subsection{Parameterized NOR2} -\label{sec:nor2} - -The parameterized nor2 (\verb|nor_2|) class generated a 2-input nor gate -of a specified size/strength and height. The \verb|nor_2| is -constructed as follows: -\begin{verbatim} -def __init__(self, name, nmos_width, height=tech.cell_6t[height]) -\end{verbatim} -The NMOS size is an input parameter, and the PMOS size -will be equal to $2$ NMOS size to have the equal rising and falling for output. -The following code instatiates the \verb|nor_2| instance seen in Figure~\ref{fig:nor2}. -\begin{verbatim} -a=nor_2.nor_2(name="nor2", nmos_width=2*tech.drc["minwidth_tx"], -height=tech.cell_6t["height"]) -\end{verbatim} - - -\begin{figure}[h!] -\centering -\includegraphics[width=10cm]{./figs/nor2.pdf} -\caption{An example of Parameterized NOR2(nor\_2)} -\label{fig:nor2} -\end{figure} - -The \verb|nor_2| parameters are explained in Table~\ref{table:nor2_params}. -\begin{table}[h!] - \begin{center} - \begin{tabular}{| l | c |} - \hline - Parameter & Explanation \\ \hline - \verb|nmos_width| & The logic size of the transistor of the nmos in the nor2 \\ \hline - \verb|height| = tech.cell\_6t[height] & physical dimension of cell height. \\ - \hline - \end{tabular} - \end{center} - \caption{Parameter Explanation of nor2} - \label{table:nor2_params} -\end{table} - - - -\subsection{Path and Wire} -\label{sec:path and wire} -OpenRam provides two routing classes in custom layout design. -Both Path and wire class will take a set of coordinates connect those points -with rectilinear metal connection. - -The difference is that path only use the same layers for both vertical and -horizontal connection while wire will use two different adjacent metal layers. -The this example will construct a metal1 layer path -\begin{verbatim} -layer_stack = ("metal1") -position_list = [(0,0), (0,3), (1,3), (1,1), (4,3)] -w=path.path(layer_stack,position_list) -\end{verbatim} -and This exmaple will construct a wire using metal1 for vertical connection and metal2 for -horizontal connection: -\begin{verbatim} -layer_stack = ("metal1","via1","metal2") -position_list = [(0,0), (0,3), (1,3), (1,1), (4,3)] -w=wire.wire(layer_stack,position_list) -\end{verbatim} - - - diff --git a/docs/porting.tex b/docs/porting.tex deleted file mode 100644 index 94085f06..00000000 --- a/docs/porting.tex +++ /dev/null @@ -1,47 +0,0 @@ -\section{Porting to a new Technologies} -\label{sec:porting} - -The folllowing sub-directories and files should be added to your new technology directory: -\begin{itemize} -\item \verb|/sp_lib| - spice netlists for library cells -\item \verb|/gds_lib| - GDSII files for the library cell -\item \verb|layers.map| - layer/purpose pair map from the technology -\item \verb|/tech| - contains tech parameters, layers, and portation functions. -\end{itemize} - -\subsection{The GDS and Spice Libraries} - -The GDS and Spice libraries , \verb|\gds_lib| and \verb|\sp_lib|, should contain the GDSII layouts and spice netlists for each of the library cells in your SRAM design. For the FreePDK45 technology, library cells for the 6T Cell, Sense Amp, Write Driver, Flip-Flops, and Control Logic are provided. To reiterate: all layouts must be exported in the GDSII file format. The following commands can be used to stream GDSII files into or out of Cadence Virtuoso: -\begin{verbatim} -To stream out of Cadence: - - strmout -layerMap ../sram_lib/layers.map - -library sram -topCell $i -view layout - -strmFile ../sram_lib/$i.gds - -To stream a layout back into Cadence: - - strmin -layerMap ../sram_lib/layers.map - -attachTechFileOfLib NCSU_TechLib_FreePDK45 - -library sram_4_32 -strmFile sram_4_32.gds -\end{verbatim} -When you import a gds file, make sure to attach the correct tech lib or you will get incorrect layers in the resulting library. - - - -\subsection{Technology Directory} -\label{sec:tech} - -Inside of the \verb|/tech| directory should be the Python classes for \verb|tech.py|, -\verb|ptx_port.py|, and any other portation functions. The \verb|tech.py| file is very important and should contain the following: -\begin{itemize} -\item Layer Number/Name - GDSII files only contain layer numbers and it can be difficult to keep track of which layer corresponds to what number. In OpenRAM code, layers are referred to by name and \verb|tech.py| maps the layer names that we use to the layer numbers in the \verb|layer.map| This will associate the layer name used in OpenRAM program with the number used in the layer.map, thus the code in complier won’t need to be changed for each technology. -\item Tech Parameters - important rules from the DRC rule deck(such as layer spacing and minimum sizes) should be included here. Please refer to the rules that are included in \verb|tech.py| to get a better idea as to what is important. -\item Cell Sizes and Pin Offsets - The \verb|cell_size()| and \verb|pin_finder()| functions should be used to populate this class with the various cell sizes and pin locations in your library cells. These functions are relatively slow because they must traverse the every shape in the entire hierarchy of a design. Due to this fact, these function are not invoked each time the compiler is run, it should be run one time or if any changes have been made to library cells. This sizes and pin locations gathered are needed to generate the dynamic cells and perform routing at the various levels of the hierarchy. It is suggested that boundary boxes on a specific layer should be added to define the cell size. -\end{itemize} - - - - - - diff --git a/docs/timing.tex b/docs/timing.tex deleted file mode 100644 index 7cf0f6d2..00000000 --- a/docs/timing.tex +++ /dev/null @@ -1,230 +0,0 @@ -\section{Timing and Control Logic} -\label{timing} - -This section outlines the necessary signals, timing considerations, and control circuitry for a synchronous SRAM. - -\subsection{Signals} -\label{signals} -Top-Level Signals: -\begin{itemize} -\setlength{\itemsep}{0pt} -\item ADDR - address bus. -\item DATA - bi-directional data bus. -\item clk - the global clock. -\item OEb - active low output enable. -\item CSb - active low chip select. -\item WEb - active low write enable. -\end{itemize} - -Internal Signals: -\begin{itemize} -\setlength{\itemsep}{0pt} -\item clk\_bar - enables the precharge unit. -\item s\_en - enables the sense amp during a read operation. -\item w\_en - enable the write driver during a write operation. -\item tri\_en and tri\_en\_bar - enable the data input tri-gate during a read operation. -\end{itemize} - -\subsection{Timing Considerations} -\label{timing_params} - -The main timing considerations for an SRAM are: -\begin{itemize} -\setlength{\itemsep}{0pt} -\item Setup Time - time an input needs to be stable before the positive/negative clock edge. -\item Hold Time - time an input needs to stay valid after the positive/negative clock edge. -\item Minimun Cycle Time - time inbetween subsequent memory operations. -\item Memory Read Time - time from negative clock edge until valid data appears on the data bus. -\item Memory Write Time - time from negative clock edge until data has been driven into a memory cell. -\end{itemize} - -\subsection{SRAM Operation} -\label{operation} - -\begin{figure}[tb] -\centering -\includegraphics[scale=.85]{./figs/timing_read.pdf} -\caption{Timing diagram for read operation showing the setup, hold, and read times.} -\label{fig:read} -\end{figure} - -Read Operation: -\begin{enumerate} -\setlength{\itemsep}{0pt} - \item Before the clock transition (low to high) that initiates the read operation: - \begin{enumerate} - \item The chip must be selected (CSb low). - \item The WEb must be high (read). - \item The row and column addresses must be applied to the address input pins (ADDR). - \item OEb should be selected (OEb low). - \end{enumerate} - \item On the rising edge of the clock (CLK): - \begin{enumerate} - \item The control signals and address are latched into flip-flops and the read cycle begins. - \item The precharging of the bit lines starts. - \item The address bits become available for the decoder and column mux, which select the row and columns that we want to read from. - \end{enumerate} - \item On the falling edge of the clock (CLK): - \begin{enumerate} - \item Word line is driven onto the bitlines, the value stored in the memory cells pulls down one of the bitlines (bl if a 0 is stored, br if a 1 is stored). - \item s\_en enables the sense amplifier which senses the voltage difference of the bit lines, produces the output and keeps the value in its latch circuitry. - \item Tri-gate drives (tri\_en and tri\_en\_bar) the output data on data bus. Data remains valid on the data bus for a complete clock cycle. - \end{enumerate} -\end{enumerate} - - -\begin{figure}[tb] -\centering -\includegraphics[scale=.9]{./figs/timing_write.pdf} -\caption{Timing diagram for write operation showing the setup, hold, and write times.} -\label{fig:write} -\end{figure} - - - -Write Operation: -\begin{enumerate} -\setlength{\itemsep}{0pt} - \item Before the clock transition (low to high) that initiates the write operation: - \begin{enumerate} - \item The chip must be selected (CSb low). - \item The WEb must be low to enable the data input tristates. - \item The row and column addresses must be applied to the address input pins (ADDR). - \item OEb must be high (no output is available and sense amp disabled) - \end{enumerate} - \item On the rising edge of the clock (CLK): - \begin{enumerate} - \item OEb stays high (no output is available and sense amp disabled) - \item The inputs addresses are latched into flip-flops, precharging starts, and the write operation begins. - \item The address bits become available for the decoder and column mux, which select the row and columns that we want to write to. - \end{enumerate} - \item On the falling edge of the clock (CLK): - \begin{enumerate} - \item The data to be written must be applied to DATA and latched into flip-flops. - \item w\_en enables the write driver, which drives the data input through the column mux and into the selected memory cells. The write delay is the time from the negative clock edge until the data value is stored in the memory cell on node X. - \end{enumerate} -\end{enumerate} - - -\subsection{Zero Bus Turnaround (ZBT)} -\label{sec:ZBT} - -In timing of SRAM, during a read operation, data should be available after the clock edge while -during a write, data should be set up before the clock edge. Due to this issue a wait state (dead cycle) is neccessary when SRAM switches -from read mode to write mode. -To avoide dead cycles in SRAM timing which slow down the operation and degrade the performance of SRAM, Zero Bus turnaround (ZBT) technique is used. -Using ZBT, during a write, data is set up after positive clock edge and before negative clock edge and input data is latched in negative edge flip-flops. -Using ZBT, we will get a higher memory throughput and there is no waite states. -Figure~\ref{fig:write} shows the correct timing for input signals during the write opertion to avoide the wait states. -Figure~\ref{fig:ZBT} shows how a write cycle is followed by a read cycle with no wait state through using ZBT. -Input address bits should be ready before positive edge to be loaded to positive edge flip-flops. Output data is ready to be loaded to data-bus during seconde half of cycle (after negative edge of clock) and -input data should be ready before negative edge of clock to be loaded in negative edge flip-flops. - -\begin{figure}[h!] -\centering -\includegraphics[scale=0.9]{./figs/ZBT.pdf} -\caption{(a) Zero Bus Turnaround timing.} -\label{fig:ZBT} -\end{figure} - - -\subsection{Control Logic} -\label{sec:control} - - - -The control circuitry ensures that the SRAM operates as intended during a read or write cycle by enabling the necessary structures in the SRAM. -As shown in Figure~\ref{fig:control}, the control logic takes three active low signals as inputs: chip select bar ($CSb$), -output enable bar ($OEb$), and write enable bar ($WEb$). $CSb$ enables the entire SRAM chip. -When $CSb$ is low, the appropriate control signals are generated and sent to the architecture blocks. -Conversely, if $CSb$ is high then no control signals are generated and SRAM is turned off or disabled. -The $OEb$ signal signifies a read operation; while it is low the value seen on the data bus will be an output from the memory. -Similarly, the $WEb$ signal signifies a write operation. All of the input control signals are latched with master-slave flip-flops, -ensuring that the control signal stays valid for the entire operation cycle. The control signal flip-flops use the normal clock to generate -local signals used to enable or disable structures based on the operation. Address flip-flops are combined with global clock as well. -In a standard write SRAM, switching from a read to a write operation results in a dead cycle. To avoid this dead cycle, Data flip-flops are -latched with $clk\_bar$ in order to have a Zero Bus Turnaround (ZBT) memory. More details on ZBT timing are outlined in Section~\ref{sec:ZBT}. -After all control signals are latched, they are ANDED with the $clk\_bar$ because the read/write circuitries should only be enabled after the precharging of -the bitlines had ended on the negative edge of the clock. The $w\_en$ signal enables the write driver during a write to the memory .The $s\_en$ signal -is generated using a Replica Bitline ($RBL$) to enable the sense amplifier during a read operation. Details on $RBL$ architecture are outlined in section~\ref{sec:RBL}. -$tri\_en$ and $tri\_en\_bar$ enable the tristates during read in order to drive the outputs onto the data bus. -Table~\ref{table:control} shows the truth table for the control logic. The $s\_en$ signal to enable the sense amplifier is -true when $(CS . OE . Clk\_bar)$ is true. Similarly, write driver enable signal, $w\_en$, is true when $(CS . WE . clk\_bar)$ is true. -$tri\_en$ and $tri\_en\_bar$ are true when $\neg(OEb\_bar | clk)$ and $\neg(OEb . clk\_bar)$ are true, respectively. -\begin{figure}[h!] -\centering -\includegraphics[scale=1]{./figs/control_logic.pdf} -\caption{(a) Control Logic diagram and (b) Replica Bitline Schematic.} -\label{fig:control} -\end{figure} - - - -\begin{table}[h!] - \begin{center} - \begin{tabular}{| c | c | c | c | c | c | c |} - \hline - Operation & \multicolumn{3}{|c|}{Inputs} & \multicolumn{3}{|c|}{Outputs}\\ \hline - & CSb & OEb & WEb & s\_en & w\_en & tri\_en\\ \hline - READ & 0 & 0 & 1 & 1 & 0 & 1\\ \hline - WRITE & 0 & 1 & 0 & 0 & 1 & 0\\ \hline - \end{tabular} - \end{center} - \caption{Generation of control signals.} - \label{table:control} -\end{table} - - -\subsection{Replica Bitline Delay} -\label{sec:RBL} - - - -In SRAM read operation, discharging the bitline is the most time consuming procedure. -Generally, sense amplifier amplifies the small voltage difference on the bitlines at the proper sense timing, -to realize high-speed operation. Therefore, the timing for sense amplifier ($s\_en$) is extremely important for the high speed and low power SRAM. -If the $s\_en$ arrives early before the bitline difference reaches the sense amplifier input transistors offset voltage, -a read functional failure may occur. Contrarily, a late-arrived $s\_en$ would consume more unnecessary time, thereby wasting the power. -The conventional way of generating $s\_en$ signal is to use a replica bitline ($RBL$). $RBL$ as shown in ~\ref{fig:RBL} consists of a column of SRAM cells (dummy cells), -which track the random process variation in array. $RBL$ is presented for matching the delay of the activation of the -sense amplifier with the delay of the propagation of the required voltage swing at the bitlines. -In $RBL$ technique, delay driven memory cell in control path is same as read path. Therefore the -delay shift of control path according to the Process, Voltage and Temperature (PVT) variation is same ratio as that of read path. -The $RBL$ technique attains self-timed tracking with optimal $s\_en$ timing according to PVT variation. -Using replica circuits, the variation on the delay of the sense amp activation and bitline swing is minimized. - -\begin{figure}[h!] -\centering -\includegraphics[scale=.9]{./figs/replica_bitline.pdf} -\caption{Replica Bitline Schematic} -\label{fig:RBL} -\end{figure} - -$RBL$ technique uses a Replica Cell ($RC$) driving a short bitline signal. The short bitline\'s capacitance is set to be a -fraction of the main bitline capacitance (e.g. one tenth). This fraction is determined by the required bitline swing -(bitline voltages larger than offset voltage at input transistors of sense amplifier) for proper sensing. So in SRAM, an -extra column block is converted into the replica column whose capacitance is the desired fraction of the main bitline. -Therefore, its capacitance ratio to the main bitlines is set purely by the ratio of the geometric lengths (e.g. one tenth). -The $RC$ is hard wired to store a zero such that it will discharge the $RBL$ once it is accessed. -Because of its similarity with the actual memory cell (in terms of design and fabrication) the delay of $RBL$ tracks the delay of -real bitlines very well and can be made roughly equal. Figure ~\ref{fig:RC} shows the schematic of the 6T replica cell. -The timing for $s\_en$ is generated as follows. At first, the $RBL$ and the normal bitlines are precharged to VDD. -Next, selected memory cells and $RC$ are activated. $RC$ draws the current from the $RBL$ and normal bitlines are -also discharged through the accessed cell. Discharged swing on $RBL$ is inverted and then buffered to generate the signal to enable the sense amplifier. - - -\begin{figure}[h!] -\centering -\includegraphics[scale=1]{./figs/replica_cell.pdf} -\caption{Replica Bitline Schematic} -\label{fig:RC} -\end{figure} - - - - -\subsection{Timing and Power Characterizer} -\label{characterizer} - -The section will provide an explanantion of the characterizer that will generete spice stimuli for the top-level SRAM and perform spice timing simulations to determine the memory setup\&hold times, the write delay, and read delay. It will also provide a spice power estimate. - diff --git a/docs/unittests.tex b/docs/unittests.tex deleted file mode 100644 index 180e9b6a..00000000 --- a/docs/unittests.tex +++ /dev/null @@ -1,100 +0,0 @@ -\section{Unit Tests} -\label{sec:unittests} - -OpenRAM comes with a unit testing framework based on the Python -unittest framework. Since OpenRAM is technology independent, these -unit tests can be run in any technology to verify that the technology -is properly ported. By default, FreePDK45 is supported. - -The unit tests consist of the following tests that test each module/sub-block of OpenRAM: -\begin{itemize} -\item \verb|00_code_format_check__test.py| - Checks the format of the codes. returns error if finds $TAB$ in codes. -\item \verb|01_library_drc_test.py| - DRC of library cells in technology \verb|gds_lib| -\item \verb|02_library_lvs_test.py| - LVS of library cells in technology \verb|gds_lib| and \verb|sp_lib| %(names must correspond with different extensions) -\item \verb|03_contact_test.py| - Test contacts/vias of different layers -\item \verb|03_path_test.py| - Test different types of paths based off of the wire module -\item \verb|03_ptx_test.py| - Test various sizes/fingers of PMOS and NMOS parameterized transistors -\item \verb|03_wire_test.py| - Test different types of wires with different layers -\item \verb|04_pinv_test.py| - Test various sizes of parameterized inverter -\item \verb|04_nand_2_test.py| - Test various sizes of parameterized nand2 -\item \verb|04_nand_3_test.py| - Test various sizes of parameterized nand3 -\item \verb|04_nor_2_test.py| - Test various sizes of parameterized nor2 -\item \verb|04_wordline_driver_test.py| - Test a wordline\_driver array. -\item \verb|05_array_test.py| - Test a small bit-cell array -\item \verb|06_nand_decoder_test.py| - Test a dynamic NAND address decoder -\item \verb|06_hierarchical_decoder_test.py| - Test a dynamic hierarchical address decoder -\item \verb|07_tree_column_mux_test.py| - Test a small tree column mux. -\item \verb|07_single_level_column_mux_test.py| - Test a small single level column mux. -\item \verb|08_precharge_test.py| - Test a dynamically generated precharge array -\item \verb|09_sense_amp_test.py| - Test a sense amplifier array -\item \verb|10_write_driver_test.py| - Test a write driver array -\item \verb|11_ms_flop_array_test.py| - Test a MS\_FF array -\item \verb|13_control_logic_test.py| - Test the control logic module -\item \verb|14_delay_chain_test.py| - Test a delay chain array -\item \verb|15_tri_gate_array_test.py| - Test a tri-gate array -\item \verb|16_replica_bitline_test.py| - Test a replica bitline -\item \verb|19_bank_test.py| - Test a bank -\item \verb|20_sram_test.py| - Test a complete small SRAM -\item \verb|21_timing_sram_test.py| - Test timing of SRAM -\item \verb|22_sram_func_test.py| - Test functionality of SRAM -\end {itemize} - -Each unit test instantiates a small component and performs DRC/LVS. Automatic DRC/LVS inside OpenRAM is disabled so that Python unittest assertions can be used to track failures, errors, and successful tests as follows: -\begin{verbatim} - self.assertFalse(calibre.run_drc(a.cell_name,tempgds)) - self.assertFalse(calibre.run_lvs(a.cell_name,tempgds,tempspice)) -\end{verbatim} -Each of these assertions will trigger a test failure. If there are -problems with interpreting modified code due to syntax errors, the -unit test framework will not capture this and it will result in an -Error. - -\subsection{Usage} - -A regression script is provided to check all of the unit tests by running: -\begin{verbatim} -python tests/regress.py -\end{verbatim} -from the compiler directory located at: "OpenRAM/trunk/compiler/". Each individual test can be run by running: -\begin{verbatim} -python tests/{unit-test file} -e.g. python tests/05_array_test.py -\end{verbatim} -from the compiler directory located at: "openram/trunk/compiler/". As an example, the unit tests all -complete and provide the following output except for the final -\verb|20_sram_test| which has 2 DRC violations: -\begin{verbatim} -[trunk/compiler]$ python tests/regress.py -runTest (01_library_drc_test.library_drc_test) ... ok -runTest (02_library_lvs_test.library_lvs_test) ... ok -runTest (03_contact_test.contact_test) ... ok -runTest (03_path_test.path_test) ... ok -runTest (03_ptx_test.ptx_test) ... ok -runTest (03_wire_test.wire_test) ... ok -runTest (04_pinv_test.pinv_test) ... ok -runTest (04_nand_2_test.nand_2_test) ... ok -runTest (04_nand_3_test.nand_3_test) ... ok -runTest (04_nor_2_test.nor_2_test) ... ok -runTest (04_wordline_driver_test.wordline_driver_test) ... ok -runTest (05_array_test.array_test) ... ok -runTest (06_hierdecoder_test.hierdecoder_test) ... ok -runTest (07_single_level_column_mux_test.single_level_column_mux_test) ... ok -runTest (08_precharge_test.precharge_test) ... ok -runTest (09_sense_amp_test.sense_amp_test) ... ok -runTest (10_write_driver_test.write_driver_test) ... ok -runTest (11_ms_flop_array_test.ms_flop_test) ... ok -runTest (13_control_logic_test.control_logic_test) ... ok -runTest (14_delay_chain_test.delay_chain_test) ... ok -runTest (15_tri_gate_array_test.tri_gate_array_test) ... ok -runTest (19_bank_test.bank_test) ... ok -runTest (20_sram_test.sram_test) ... ok -\end{verbatim} - -If there are any DRC/LVS violations during the test, all the summary,output,and error files -will be generated in the technology directory's "openram\_temp" folder. One would view those -files to determine the cause of the DRC/LVS violations. - -More information on the Python unittest framework is available at\\ -\begin{center} -\url{http://docs.python.org/2/library/unittest.html}. -\end{center} diff --git a/technology/freepdk45/gds_lib/cell_1w_1r.gds b/technology/freepdk45/gds_lib/cell_1w_1r.gds new file mode 100644 index 00000000..67498962 Binary files /dev/null and b/technology/freepdk45/gds_lib/cell_1w_1r.gds differ diff --git a/technology/freepdk45/gds_lib/replica_cell_1w_1r.gds b/technology/freepdk45/gds_lib/replica_cell_1w_1r.gds new file mode 100644 index 00000000..31deb82b Binary files /dev/null and b/technology/freepdk45/gds_lib/replica_cell_1w_1r.gds differ diff --git a/technology/freepdk45/sp_lib/cell_1w_1r.sp b/technology/freepdk45/sp_lib/cell_1w_1r.sp new file mode 100644 index 00000000..eb3803b4 --- /dev/null +++ b/technology/freepdk45/sp_lib/cell_1w_1r.sp @@ -0,0 +1,14 @@ + +.SUBCKT cell_1w_1r bl0 br0 bl1 br1 wl0 wl1 vdd gnd +MM9 RA_to_R_right wl1 br1 gnd NMOS_VTG W=180.0n L=50n m=1 +MM8 RA_to_R_right Q gnd gnd NMOS_VTG W=180.0n L=50n m=1 +MM7 RA_to_R_left Q_bar gnd gnd NMOS_VTG W=180.0n L=50n m=1 +MM6 RA_to_R_left wl1 bl1 gnd NMOS_VTG W=180.0n L=50n m=1 +MM5 Q wl0 bl0 gnd NMOS_VTG W=135.00n L=50n m=1 +MM4 Q_bar wl0 br0 gnd NMOS_VTG W=135.00n L=50n m=1 +MM1 Q Q_bar gnd gnd NMOS_VTG W=205.0n L=50n m=1 +MM0 Q_bar Q gnd gnd NMOS_VTG W=205.0n L=50n m=1 +MM3 Q Q_bar vdd vdd PMOS_VTG W=90n L=50n m=1 +MM2 Q_bar Q vdd vdd PMOS_VTG W=90n L=50n m=1 +.ENDS + diff --git a/technology/freepdk45/sp_lib/replica_cell_1w_1r.sp b/technology/freepdk45/sp_lib/replica_cell_1w_1r.sp new file mode 100644 index 00000000..fd06db8c --- /dev/null +++ b/technology/freepdk45/sp_lib/replica_cell_1w_1r.sp @@ -0,0 +1,14 @@ + +.SUBCKT replica_cell_1w_1r bl0 br0 bl1 br1 wl0 wl1 vdd gnd +MM9 RA_to_R_right wl1 br1 gnd NMOS_VTG W=180.0n L=50n m=1 +MM8 RA_to_R_right Q gnd gnd NMOS_VTG W=180.0n L=50n m=1 +MM7 RA_to_R_left vdd gnd gnd NMOS_VTG W=180.0n L=50n m=1 +MM6 RA_to_R_left wl1 bl1 gnd NMOS_VTG W=180.0n L=50n m=1 +MM5 Q wl0 bl0 gnd NMOS_VTG W=135.00n L=50n m=1 +MM4 vdd wl0 br0 gnd NMOS_VTG W=135.00n L=50n m=1 +MM1 Q vdd gnd gnd NMOS_VTG W=205.0n L=50n m=1 +MM0 vdd Q gnd gnd NMOS_VTG W=205.0n L=50n m=1 +MM3 Q vdd vdd vdd PMOS_VTG W=90n L=50n m=1 +MM2 vdd Q vdd vdd PMOS_VTG W=90n L=50n m=1 +.ENDS + diff --git a/technology/freepdk45/tech/tech.py b/technology/freepdk45/tech/tech.py index 14ce1953..760d2a5a 100644 --- a/technology/freepdk45/tech/tech.py +++ b/technology/freepdk45/tech/tech.py @@ -271,7 +271,12 @@ spice["fet_models"] = { "TT" : [SPICE_MODEL_DIR+"/models_nom/PMOS_VTG.inc",SPICE "FF" : [SPICE_MODEL_DIR+"/models_ff/PMOS_VTG.inc",SPICE_MODEL_DIR+"/models_ff/NMOS_VTG.inc"], "SF" : [SPICE_MODEL_DIR+"/models_ss/PMOS_VTG.inc",SPICE_MODEL_DIR+"/models_ff/NMOS_VTG.inc"], "FS" : [SPICE_MODEL_DIR+"/models_ff/PMOS_VTG.inc",SPICE_MODEL_DIR+"/models_ss/NMOS_VTG.inc"], - "SS" : [SPICE_MODEL_DIR+"/models_ss/PMOS_VTG.inc",SPICE_MODEL_DIR+"/models_ss/NMOS_VTG.inc"]} + "SS" : [SPICE_MODEL_DIR+"/models_ss/PMOS_VTG.inc",SPICE_MODEL_DIR+"/models_ss/NMOS_VTG.inc"], + "ST" : [SPICE_MODEL_DIR+"/models_ss/PMOS_VTG.inc",SPICE_MODEL_DIR+"/models_nom/NMOS_VTG.inc"], + "TS" : [SPICE_MODEL_DIR+"/models_nom/PMOS_VTG.inc",SPICE_MODEL_DIR+"/models_ss/NMOS_VTG.inc"], + "FT" : [SPICE_MODEL_DIR+"/models_ff/PMOS_VTG.inc",SPICE_MODEL_DIR+"/models_nom/NMOS_VTG.inc"], + "TF" : [SPICE_MODEL_DIR+"/models_nom/PMOS_VTG.inc",SPICE_MODEL_DIR+"/models_ff/NMOS_VTG.inc"], + } #spice stimulus related variables spice["feasible_period"] = 5 # estimated feasible period in ns @@ -295,6 +300,8 @@ spice["channel"] = drc["minlength_channel"] spice["clk"] = "clk" # analytical delay parameters +spice["vdd_nominal"] = 1.0 # Typical Threshold voltage in Volts +spice["temp_nominal"] = 25.0 # Typical Threshold voltage in Volts spice["v_threshold_typical"] = 0.4 # Typical Threshold voltage in Volts spice["wire_unit_r"] = 0.075 # Unit wire resistance in ohms/square spice["wire_unit_c"] = 0.64 # Unit wire capacitance ff/um^2 @@ -328,12 +335,16 @@ spice["nand2_transition_prob"] = .1875 # Transition probability of 2-input na spice["nand3_transition_prob"] = .1094 # Transition probability of 3-input nand. spice["nor2_transition_prob"] = .1875 # Transition probability of 2-input nor. -#Logical Effort relative values for the Handmade cells +#Parameters related to sense amp enable timing and delay chain/RBL sizing +parameter["static_delay_stages"] = 4 +parameter["static_fanout_per_stage"] = 3 +parameter["static_fanout_list"] = parameter["static_delay_stages"]*[parameter["static_fanout_per_stage"]] parameter["dff_clk_cin"] = 30.6 #relative capacitance parameter["6tcell_wl_cin"] = 3 #relative capacitance -parameter["min_inv_para_delay"] = .5 #Tau delay units +parameter["min_inv_para_delay"] = 2.4 #Tau delay units parameter["sa_en_pmos_size"] = .72 #micro-meters parameter["sa_en_nmos_size"] = .27 #micro-meters +parameter["rbl_height_percentage"] = .5 #Height of RBL compared to bitcell array ################################################### ##END Spice Simulation Parameters diff --git a/technology/scn3me_subm/tech/tech.py b/technology/scn3me_subm/tech/tech.py index d448b5dc..e088eff9 100755 --- a/technology/scn3me_subm/tech/tech.py +++ b/technology/scn3me_subm/tech/tech.py @@ -240,6 +240,8 @@ spice["clk"] = "clk" # analytical delay parameters # FIXME: These need to be updated for SCMOS, they are copied from FreePDK45. +spice["vdd_nominal"] = 5.0 # Typical Threshold voltage in Volts +spice["temp_nominal"] = 25.0 # Typical Threshold voltage in Volts spice["v_threshold_typical"] = 1.3 # Typical Threshold voltage in Volts spice["wire_unit_r"] = 0.075 # Unit wire resistance in ohms/square spice["wire_unit_c"] = 0.64 # Unit wire capacitance ff/um^2 diff --git a/technology/scn4m_subm/gds_lib/cell_1w_1r.gds b/technology/scn4m_subm/gds_lib/cell_1w_1r.gds new file mode 100644 index 00000000..782c43dc Binary files /dev/null and b/technology/scn4m_subm/gds_lib/cell_1w_1r.gds differ diff --git a/technology/scn4m_subm/gds_lib/replica_cell_1w_1r.gds b/technology/scn4m_subm/gds_lib/replica_cell_1w_1r.gds new file mode 100644 index 00000000..ce6e413b Binary files /dev/null and b/technology/scn4m_subm/gds_lib/replica_cell_1w_1r.gds differ diff --git a/technology/scn4m_subm/mag_lib/cell_6t.ext b/technology/scn4m_subm/mag_lib/cell_6t.ext new file mode 100644 index 00000000..79f3c8b4 --- /dev/null +++ b/technology/scn4m_subm/mag_lib/cell_6t.ext @@ -0,0 +1,41 @@ +timestamp 1536091415 +version 8.2 +tech scmos +style TSMC0.35um(tsmc35)from:t11c +scale 1000 1 5 +resistclasses 3700 2800 1018000 1018000 1 6000 6000 80 70 80 40 +node "comment_0_0#" 0 0 0 0 bb 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +node "br" 6 -1.43219e-14 96 -8 ndc 320 72 0 0 0 0 0 0 0 0 0 0 0 0 512 96 3456 464 0 0 0 0 +node "bl" 6 -8.88178e-16 40 -8 ndc 320 72 0 0 0 0 0 0 0 0 0 0 0 0 512 96 3200 432 0 0 0 0 +node "wl" 115 -2.89546e-13 -8 12 p 0 0 0 0 0 0 0 0 0 0 1536 360 0 0 2496 344 0 0 0 0 0 0 +node "a_36_40#" 140 -3.51719e-13 36 40 ndif 960 144 304 72 0 0 0 0 0 0 1984 424 0 0 2048 288 0 0 0 0 0 0 +node "a_28_32#" 160 -8.06466e-13 28 32 p 960 144 304 72 0 0 0 0 0 0 2000 456 0 0 1920 272 0 0 0 0 0 0 +node "gnd" 41 -27.888 -32 -32 pw 1792 240 512 128 0 0 0 0 29600 696 0 0 0 0 2688 400 6400 864 0 0 0 0 +equiv "gnd" "gnd" +node "vdd" 2340 2596 -32 116 nw 256 64 800 176 17600 576 0 0 0 0 0 0 0 0 3456 464 256 64 0 0 0 0 +cap "wl" "bl" 189.768 +cap "a_36_40#" "br" 17.59 +cap "wl" "br" 189.768 +cap "vdd" "bl" 135.015 +cap "bl" "br" 27.492 +cap "vdd" "br" 117.084 +cap "gnd" "a_28_32#" 880.405 +cap "gnd" "a_36_40#" 401.284 +cap "a_28_32#" "a_36_40#" 272.793 +cap "gnd" "wl" 1198.41 +cap "gnd" "bl" 712.11 +cap "a_28_32#" "wl" 108.364 +cap "vdd" "gnd" 510.12 +cap "gnd" "br" 698.471 +cap "a_36_40#" "wl" 108.364 +cap "a_28_32#" "bl" 104.205 +cap "vdd" "a_28_32#" 430.812 +cap "a_36_40#" "bl" 29.396 +cap "a_28_32#" "br" 308.488 +cap "vdd" "a_36_40#" 709.108 +fet nfet 96 12 97 13 128 48 "gnd" "wl" 16 0 "br" 16 0 "a_28_32#" 16 0 +fet nfet 40 12 41 13 128 48 "gnd" "wl" 16 0 "bl" 16 0 "a_36_40#" 16 0 +fet nfet 116 40 117 41 256 80 "gnd" "a_36_40#" 16 0 "a_28_32#" 32 0 "gnd" 32 0 +fet nfet 28 40 29 41 256 80 "gnd" "a_28_32#" 16 0 "gnd" 32 0 "a_36_40#" 32 0 +fet pfet 108 148 109 149 192 56 "vdd" "a_36_40#" 32 0 "a_28_32#" 12 0 "vdd" 12 0 +fet pfet 28 148 29 149 192 56 "vdd" "a_28_32#" 32 0 "vdd" 12 0 "a_36_40#" 12 0 diff --git a/technology/scn4m_subm/mag_lib/cell_6t.spice b/technology/scn4m_subm/mag_lib/cell_6t.spice new file mode 100644 index 00000000..31eec08a --- /dev/null +++ b/technology/scn4m_subm/mag_lib/cell_6t.spice @@ -0,0 +1,15 @@ +* SPICE3 file created from cell_6t.ext - technology: scmos + +M1000 a_36_40# a_28_32# vdd vdd pfet w=0.6u l=0.8u ++ ad=0.76p pd=3.6u as=2p ps=8.8u +M1001 vdd a_36_40# a_28_32# vdd pfet w=0.6u l=0.8u ++ ad=0p pd=0u as=0.76p ps=3.6u +M1002 a_36_40# a_28_32# gnd gnd nfet w=1.6u l=0.4u ++ ad=2.4p pd=7.2u as=4.48p ps=12u +M1003 gnd a_36_40# a_28_32# gnd nfet w=1.6u l=0.4u ++ ad=0p pd=0u as=2.4p ps=7.2u +M1004 a_36_40# wl bl gnd nfet w=0.8u l=0.4u ++ ad=0p pd=0u as=0.8p ps=3.6u +M1005 a_28_32# wl br gnd nfet w=0.8u l=0.4u ++ ad=0p pd=0u as=0.8p ps=3.6u +C0 vdd 0 2.60fF diff --git a/technology/scn4m_subm/mag_lib/replica_cell_6t.ext b/technology/scn4m_subm/mag_lib/replica_cell_6t.ext new file mode 100644 index 00000000..726cd738 --- /dev/null +++ b/technology/scn4m_subm/mag_lib/replica_cell_6t.ext @@ -0,0 +1,35 @@ +timestamp 1541443051 +version 8.2 +tech scmos +style TSMC0.35um(tsmc35)from:t11c +scale 1000 1 5 +resistclasses 3700 2800 1018000 1018000 1 6000 6000 80 70 80 40 +node "comment_0_0#" 0 0 0 0 bb 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +node "br" 6 1.40998e-14 96 -8 ndc 320 72 0 0 0 0 0 0 0 0 0 0 0 0 512 96 3456 464 0 0 0 0 +node "bl" 6 -8.88178e-16 40 -8 ndc 320 72 0 0 0 0 0 0 0 0 0 0 0 0 512 96 3200 432 0 0 0 0 +node "wl" 115 -2.89546e-13 -8 12 p 0 0 0 0 0 0 0 0 0 0 1536 360 0 0 2496 344 0 0 0 0 0 0 +node "a_36_40#" 140 -3.51719e-13 36 40 ndif 960 144 304 72 0 0 0 0 0 0 1984 424 0 0 2048 288 0 0 0 0 0 0 +node "gnd" 41 -27.888 -32 -32 pw 1792 240 512 128 0 0 0 0 29600 696 0 0 0 0 2688 400 6400 864 0 0 0 0 +equiv "gnd" "gnd" +node "vdd" 2517 2596 -32 116 nw 1216 208 1104 248 17600 576 0 0 0 0 2000 456 0 0 5632 736 256 64 0 0 0 0 +cap "vdd" "br" 442.06 +cap "bl" "wl" 189.768 +cap "gnd" "br" 698.471 +cap "bl" "a_36_40#" 29.396 +cap "wl" "a_36_40#" 108.364 +cap "bl" "vdd" 239.22 +cap "bl" "gnd" 712.11 +cap "wl" "vdd" 108.364 +cap "wl" "gnd" 1198.41 +cap "bl" "br" 27.492 +cap "a_36_40#" "vdd" 981.901 +cap "wl" "br" 189.768 +cap "a_36_40#" "gnd" 401.284 +cap "vdd" "gnd" 1390.52 +cap "a_36_40#" "br" 17.59 +fet nfet 96 12 97 13 128 48 "gnd" "wl" 16 0 "br" 16 0 "vdd" 16 0 +fet nfet 40 12 41 13 128 48 "gnd" "wl" 16 0 "bl" 16 0 "a_36_40#" 16 0 +fet nfet 116 40 117 41 256 80 "gnd" "a_36_40#" 16 0 "vdd" 32 0 "gnd" 32 0 +fet nfet 28 40 29 41 256 80 "gnd" "vdd" 16 0 "gnd" 32 0 "a_36_40#" 32 0 +fet pfet 108 148 109 149 192 56 "vdd" "a_36_40#" 32 0 "vdd" 24 0 +fet pfet 28 148 29 149 192 56 "vdd" "vdd" 32 0 "vdd" 12 0 "a_36_40#" 12 0 diff --git a/technology/scn4m_subm/mag_lib/replica_cell_6t.spice b/technology/scn4m_subm/mag_lib/replica_cell_6t.spice new file mode 100644 index 00000000..bb64476f --- /dev/null +++ b/technology/scn4m_subm/mag_lib/replica_cell_6t.spice @@ -0,0 +1,16 @@ +* SPICE3 file created from replica_cell_6t.ext - technology: scmos + +M1000 a_36_40# vdd vdd vdd pfet w=0.6u l=0.8u ++ ad=0.76p pd=3.6u as=2.76p ps=12.4u +** SOURCE/DRAIN TIED +M1001 vdd a_36_40# vdd vdd pfet w=0.8u l=0.6u ++ ad=0p pd=0u as=0p ps=0u +M1002 a_36_40# vdd gnd gnd nfet w=1.6u l=0.4u ++ ad=2.4p pd=7.2u as=4.48p ps=12u +M1003 gnd a_36_40# vdd gnd nfet w=1.6u l=0.4u ++ ad=0p pd=0u as=3.04p ps=10.4u +M1004 a_36_40# wl bl gnd nfet w=0.8u l=0.4u ++ ad=0p pd=0u as=0.8p ps=3.6u +M1005 vdd wl br gnd nfet w=0.8u l=0.4u ++ ad=0p pd=0u as=0.8p ps=3.6u +C0 vdd 0 2.60fF diff --git a/technology/scn4m_subm/sp_lib/cell_1w_1r.sp b/technology/scn4m_subm/sp_lib/cell_1w_1r.sp new file mode 100644 index 00000000..b40f589a --- /dev/null +++ b/technology/scn4m_subm/sp_lib/cell_1w_1r.sp @@ -0,0 +1,14 @@ + +.SUBCKT cell_1w_1r bl0 br0 bl1 br1 wl0 wl1 vdd gnd +MM9 RA_to_R_right wl1 br1 gnd n w=1.2u l=0.4u +MM8 RA_to_R_right Q gnd gnd n w=1.2u l=0.4u +MM7 RA_to_R_left Q_bar gnd gnd n w=1.2u l=0.4u +MM6 RA_to_R_left wl1 bl1 gnd n w=1.2u l=0.4u +MM5 Q wl0 bl0 gnd n w=0.8u l=0.4u +MM4 Q_bar wl0 br0 gnd n w=0.8u l=0.4u +MM1 Q Q_bar gnd gnd n w=1.6u l=0.4u +MM0 Q_bar Q gnd gnd n w=1.6u l=0.4u +MM3 Q Q_bar vdd vdd p w=0.6u l=0.4u +MM2 Q_bar Q vdd vdd p w=0.6u l=0.4u +.ENDS + diff --git a/technology/scn4m_subm/sp_lib/cell_6t.st0 b/technology/scn4m_subm/sp_lib/cell_6t.st0 new file mode 100644 index 00000000..52729df3 --- /dev/null +++ b/technology/scn4m_subm/sp_lib/cell_6t.st0 @@ -0,0 +1,38 @@ +****** HSPICE -- M-2017.03 linux64 (Feb 20 2017) ****** + Input File: cell_6t.sp + lic: + lic: FLEXlm: SDK_11.6.4 + lic: USER: mrg HOSTNAME: 72fb17cef281 + lic: HOSTID: 0242ac110002 PID: 69 + lic: Using FLEXlm license file: + lic: 27000@license.soe.ucsc.edu + lic: Checkout 1 hspice + lic: License/Maintenance for hspice will expire on 18-dec-2020/2018.09 + lic: 1(in_use)/50(total) FLOATING license(s) on SERVER 27000@license.soe.ucsc.edu + lic: + init: begin read circuit files, cpu clock= 9.60E-01 + option search = /bsoe/software/synopsys/M-2017.03/hspice/parts/a + d + option search = /bsoe/software/synopsys/M-2017.03/hspice/parts/b + ehave + option search = /bsoe/software/synopsys/M-2017.03/hspice/parts/c + omlinear + option search = /bsoe/software/synopsys/M-2017.03/hspice/parts/d + io + option search = /bsoe/software/synopsys/M-2017.03/hspice/parts/f + et + option search = /bsoe/software/synopsys/M-2017.03/hspice/parts/l + in_tech + option search = /bsoe/software/synopsys/M-2017.03/hspice/parts/p + ci + option search = /bsoe/software/synopsys/M-2017.03/hspice/parts/s + ignet + option search = /bsoe/software/synopsys/M-2017.03/hspice/parts/t + i + option search = /bsoe/software/synopsys/M-2017.03/hspice/parts/x + ilinx + option runlvl + init: end read circuit files, cpu clock= 9.60E-01 peak memory= 290 mb + init: begin check errors, cpu clock= 9.60E-01 +>error ***** hspice job aborted + lic: Release hspice token(s) diff --git a/technology/scn4m_subm/sp_lib/replica_cell_1w_1r.sp b/technology/scn4m_subm/sp_lib/replica_cell_1w_1r.sp new file mode 100644 index 00000000..6c2d3c1b --- /dev/null +++ b/technology/scn4m_subm/sp_lib/replica_cell_1w_1r.sp @@ -0,0 +1,14 @@ + +.SUBCKT replica_cell_1w_1r bl0 br0 bl1 br1 wl0 wl1 vdd gnd +MM9 RA_to_R_right wl1 br1 gnd n w=1.2u l=0.4u +MM8 RA_to_R_right Q gnd gnd n w=1.2u l=0.4u +MM7 RA_to_R_left vdd gnd gnd n w=1.2u l=0.4u +MM6 RA_to_R_left wl1 bl1 gnd n w=1.2u l=0.4u +MM5 Q wl0 bl0 gnd n w=0.8u l=0.4u +MM4 vdd wl0 br0 gnd n w=0.8u l=0.4u +MM1 Q vdd gnd gnd n w=1.6u l=0.4u +MM0 vdd Q gnd gnd n w=1.6u l=0.4u +MM3 Q vdd vdd vdd p w=0.6u l=0.4u +MM2 vdd Q vdd vdd p w=0.6u l=0.4u +.ENDS + diff --git a/technology/scn4m_subm/tech/tech.py b/technology/scn4m_subm/tech/tech.py index 3b7e2142..78222fd6 100755 --- a/technology/scn4m_subm/tech/tech.py +++ b/technology/scn4m_subm/tech/tech.py @@ -236,7 +236,12 @@ spice["fet_models"] = { "TT" : [SPICE_MODEL_DIR+"/nom/pmos.sp",SPICE_MODEL_DIR+" "FF" : [SPICE_MODEL_DIR+"/ff/pmos.sp",SPICE_MODEL_DIR+"/ff/nmos.sp"], "FS" : [SPICE_MODEL_DIR+"/ff/pmos.sp",SPICE_MODEL_DIR+"/ss/nmos.sp"], "SF" : [SPICE_MODEL_DIR+"/ss/pmos.sp",SPICE_MODEL_DIR+"/ff/nmos.sp"], - "SS" : [SPICE_MODEL_DIR+"/ss/pmos.sp",SPICE_MODEL_DIR+"/ss/nmos.sp"] } + "SS" : [SPICE_MODEL_DIR+"/ss/pmos.sp",SPICE_MODEL_DIR+"/ss/nmos.sp"], + "ST" : [SPICE_MODEL_DIR+"/ss/pmos.sp",SPICE_MODEL_DIR+"/nom/nmos.sp"], + "TS" : [SPICE_MODEL_DIR+"/nom/pmos.sp",SPICE_MODEL_DIR+"/ss/nmos.sp"], + "FT" : [SPICE_MODEL_DIR+"/ff/pmos.sp",SPICE_MODEL_DIR+"/nom/nmos.sp"], + "TF" : [SPICE_MODEL_DIR+"/nom/pmos.sp",SPICE_MODEL_DIR+"/ff/nmos.sp"], + } #spice stimulus related variables @@ -261,6 +266,8 @@ spice["clk"] = "clk" # analytical delay parameters # FIXME: These need to be updated for SCMOS, they are copied from FreePDK45. +spice["vdd_nominal"] = 5.0 # Typical Threshold voltage in Volts +spice["temp_nominal"] = 25.0 # Typical Threshold voltage in Volts spice["v_threshold_typical"] = 1.3 # Typical Threshold voltage in Volts spice["wire_unit_r"] = 0.075 # Unit wire resistance in ohms/square spice["wire_unit_c"] = 0.64 # Unit wire capacitance ff/um^2 @@ -295,11 +302,15 @@ spice["nand3_transition_prob"] = .1094 # Transition probability of 3-input na spice["nor2_transition_prob"] = .1875 # Transition probability of 2-input nor. #Logical Effort relative values for the Handmade cells +parameter["static_delay_stages"] = 4 +parameter["static_fanout_per_stage"] = 3 +parameter["static_fanout_list"] = parameter["static_delay_stages"]*[parameter["static_fanout_per_stage"]] parameter["dff_clk_cin"] = 27.5 parameter["6tcell_wl_cin"] = 2 parameter["min_inv_para_delay"] = .5 parameter["sa_en_pmos_size"] = 24*_lambda_ parameter["sa_en_nmos_size"] = 9*_lambda_ +parameter["rbl_height_percentage"] = .5 #Height of RBL compared to bitcell array ################################################### ##END Spice Simulation Parameters