From cb6f1b7f5d3c56f58e7287f6fd49198a776ed576 Mon Sep 17 00:00:00 2001 From: trav Date: Thu, 4 Feb 2021 22:45:30 -0500 Subject: [PATCH] whoops didnt mean to add examples n tests --- etc/examples and tests/100x100.bmp | Bin 1662 -> 0 bytes etc/examples and tests/4in2.bmp | Bin 15662 -> 0 bytes .../buttonshimexamplepihole.py | 99 ------- etc/examples and tests/epd4in2.py | 279 ------------------ etc/examples and tests/epdconfig.py | 73 ----- etc/examples and tests/photodisplaytest.py | 58 ---- etc/examples and tests/rainbow.py | 20 -- etc/examples and tests/upload.bmp | Bin 15662 -> 0 bytes etc/examples and tests/wavesharedemo.py | 71 ----- etc/sleep.py | 20 -- etc/welcomehome.jpg | Bin 41278 -> 0 bytes 11 files changed, 620 deletions(-) delete mode 100644 etc/examples and tests/100x100.bmp delete mode 100644 etc/examples and tests/4in2.bmp delete mode 100644 etc/examples and tests/buttonshimexamplepihole.py delete mode 100644 etc/examples and tests/epd4in2.py delete mode 100644 etc/examples and tests/epdconfig.py delete mode 100644 etc/examples and tests/photodisplaytest.py delete mode 100644 etc/examples and tests/rainbow.py delete mode 100644 etc/examples and tests/upload.bmp delete mode 100644 etc/examples and tests/wavesharedemo.py delete mode 100644 etc/sleep.py delete mode 100644 etc/welcomehome.jpg diff --git a/etc/examples and tests/100x100.bmp b/etc/examples and tests/100x100.bmp deleted file mode 100644 index 8d0d675f5b95e12413bcd22e1f7fef33175593c0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1662 zcmZ?rtz%;V13Mt80mLa#%*en97Iy&33voj*SO7}=|NkGEOFUa1s1pbpU^?W%++oE3 k!N8B=zfu064i8{DL~-9Je>6Oh^Y3VSAUQq2igrRY08D+GTL1t6 diff --git a/etc/examples and tests/4in2.bmp b/etc/examples and tests/4in2.bmp deleted file mode 100644 index b380a1cbfc4d437e7eac77fa2e86631ef7cfbe32..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15662 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 X?f?BQqd%uR8-V*=_I};}nFam>6LNdO diff --git a/etc/examples and tests/buttonshimexamplepihole.py b/etc/examples and tests/buttonshimexamplepihole.py deleted file mode 100644 index fecf8e3..0000000 --- a/etc/examples and tests/buttonshimexamplepihole.py +++ /dev/null @@ -1,99 +0,0 @@ -#!/user/bin/env python - -import signal -import buttonshim -import time -import subprocess - -print(""" - Pi-Hole Button Control Running.... - - Press Ctrl+C to Exit. - """) - -#Cycle and clear LEDs on startup (visual indication the script is running) -buttonshim.set_pixel(255,0,0) -time.sleep(0.3) -buttonshim.set_pixel(0,255,0) -time.sleep(0.3) -buttonshim.set_pixel(0,0,255) -time.sleep(0.3) -buttonshim.set_pixel(0,0,0) -pressId = 0 - -while True: - def DisablePiholeTimer(numSecs): - global pressId - loopId = pressId - for i in range(0,numSecs): - if ( loopId != pressId): - print "Ending loop with ID: " + str(loopId) - return - print "Pi-Hole disabled for " + str(numSecs-i) - buttonshim.set_pixel(255,255,0) - time.sleep(0.5) - buttonshim.set_pixel(255,150,0) - time.sleep(0.5) - buttonshim.set_pixel(0,0,0) - print "Pi-Hole reenabled" - - def SuspendPihole(): - global pressId - loopId = pressId - print "Pi-Hole suspended" - while (loopId == pressId): - buttonshim.set_pixel(255,0,0) - time.sleep(0.5) - buttonshim.set_pixel(0,0,0) - time.sleep(0.5) - - def EnablePihole(): - global pressId - loopId = pressId - print "Pi-Hole enabled" - for i in range(0,2): - buttonshim.set_pixel(0,255,0) - time.sleep(0.3) - buttonshim.set_pixel(0,0,0) - time.sleep(0.3) - - - @buttonshim.on_press(buttonshim.BUTTON_A) - def button_a(button, pressed): - print "Disabling Pi-Hole for 300s" - global pressId - pressId += 1 - subprocess.call(['pihole','disable','300s']) - DisablePiholeTimer(int(300)) - - @buttonshim.on_press(buttonshim.BUTTON_B) - def button_b(button, pressed): - print "Disabling Pi-Hole for 1800s" - global pressId - pressId += 1 - subprocess.call(['pihole','disable','1800s']) - DisablePiholeTimer(int(1800)) - - @buttonshim.on_press(buttonshim.BUTTON_C) - def button_c(button, pressed): - print "This button, it does nothing" - - @buttonshim.on_press(buttonshim.BUTTON_D) - def button_d(button, pressed): - print "Suspending Pi-Hole" - global pressId - pressId += 1 - subprocess.call(['pihole','disable']) - SuspendPihole() - - @buttonshim.on_press(buttonshim.BUTTON_E) - def button_e(button, pressed): - print "Enabling Pi-Hole" - global pressId - pressId += 1 - subprocess.call(['pihole','enable']) - EnablePihole() - - - - signal.pause() diff --git a/etc/examples and tests/epd4in2.py b/etc/examples and tests/epd4in2.py deleted file mode 100644 index 567ae25..0000000 --- a/etc/examples and tests/epd4in2.py +++ /dev/null @@ -1,279 +0,0 @@ -# /***************************************************************************** -# * | File : EPD_1in54.py -# * | Author : Waveshare team -# * | Function : Electronic paper driver -# * | Info : -# *---------------- -# * | This version: V3.0 -# * | Date : 2018-11-06 -# * | Info : python2 demo -# * 1.Remove: -# digital_write(self, pin, value) -# digital_read(self, pin) -# delay_ms(self, delaytime) -# set_lut(self, lut) -# self.lut = self.lut_full_update -# * 2.Change: -# display_frame -> TurnOnDisplay -# set_memory_area -> SetWindow -# set_memory_pointer -> SetCursor -# get_frame_buffer -> getbuffer -# set_frame_memory -> display -# * 3.How to use -# epd = epd2in7.EPD() -# epd.init(epd.lut_full_update) -# image = Image.new('1', (epd1in54.EPD_WIDTH, epd1in54.EPD_HEIGHT), 255) -# ... -# drawing ...... -# ... -# epd.display(getbuffer(image)) -# ******************************************************************************/ -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documnetation 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 -# furished 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 OR 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. -# - - -import epdconfig -from PIL import Image -import RPi.GPIO as GPIO - -# Display resolution -EPD_WIDTH = 400 -EPD_HEIGHT = 300 - -# GDEW042T2 commands -PANEL_SETTING = 0x00 -POWER_SETTING = 0x01 -POWER_OFF = 0x02 -POWER_OFF_SEQUENCE_SETTING = 0x03 -POWER_ON = 0x04 -POWER_ON_MEASURE = 0x05 -BOOSTER_SOFT_START = 0x06 -DEEP_SLEEP = 0x07 -DATA_START_TRANSMISSION_1 = 0x10 -DATA_STOP = 0x11 -DISPLAY_REFRESH = 0x12 -DATA_START_TRANSMISSION_2 = 0x13 -LUT_FOR_VCOM = 0x20 -LUT_WHITE_TO_WHITE = 0x21 -LUT_BLACK_TO_WHITE = 0x22 -LUT_WHITE_TO_BLACK = 0x23 -LUT_BLACK_TO_BLACK = 0x24 -PLL_CONTROL = 0x30 -TEMPERATURE_SENSOR_COMMAND = 0x40 -TEMPERATURE_SENSOR_SELECTION = 0x41 -TEMPERATURE_SENSOR_WRITE = 0x42 -TEMPERATURE_SENSOR_READ = 0x43 -VCOM_AND_DATA_INTERVAL_SETTING = 0x50 -LOW_POWER_DETECTION = 0x51 -TCON_SETTING = 0x60 -RESOLUTION_SETTING = 0x61 -GSST_SETTING = 0x65 -GET_STATUS = 0x71 -AUTO_MEASUREMENT_VCOM = 0x80 -READ_VCOM_VALUE = 0x81 -VCM_DC_SETTING = 0x82 -PARTIAL_WINDOW = 0x90 -PARTIAL_IN = 0x91 -PARTIAL_OUT = 0x92 -PROGRAM_MODE = 0xA0 -ACTIVE_PROGRAMMING = 0xA1 -READ_OTP = 0xA2 -POWER_SAVING = 0xE3 -class EPD: - def __init__(self): - self.reset_pin = epdconfig.RST_PIN - self.dc_pin = epdconfig.DC_PIN - self.busy_pin = epdconfig.BUSY_PIN - self.width = EPD_WIDTH - self.height = EPD_HEIGHT - - lut_vcom0 = [ - 0x00, 0x17, 0x00, 0x00, 0x00, 0x02, - 0x00, 0x17, 0x17, 0x00, 0x00, 0x02, - 0x00, 0x0A, 0x01, 0x00, 0x00, 0x01, - 0x00, 0x0E, 0x0E, 0x00, 0x00, 0x02, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - ] - lut_ww = [ - 0x40, 0x17, 0x00, 0x00, 0x00, 0x02, - 0x90, 0x17, 0x17, 0x00, 0x00, 0x02, - 0x40, 0x0A, 0x01, 0x00, 0x00, 0x01, - 0xA0, 0x0E, 0x0E, 0x00, 0x00, 0x02, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - ] - lut_bw = [ - 0x40, 0x17, 0x00, 0x00, 0x00, 0x02, - 0x90, 0x17, 0x17, 0x00, 0x00, 0x02, - 0x40, 0x0A, 0x01, 0x00, 0x00, 0x01, - 0xA0, 0x0E, 0x0E, 0x00, 0x00, 0x02, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - ] - lut_wb = [ - 0x80, 0x17, 0x00, 0x00, 0x00, 0x02, - 0x90, 0x17, 0x17, 0x00, 0x00, 0x02, - 0x80, 0x0A, 0x01, 0x00, 0x00, 0x01, - 0x50, 0x0E, 0x0E, 0x00, 0x00, 0x02, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - ] - lut_bb = [ - 0x80, 0x17, 0x00, 0x00, 0x00, 0x02, - 0x90, 0x17, 0x17, 0x00, 0x00, 0x02, - 0x80, 0x0A, 0x01, 0x00, 0x00, 0x01, - 0x50, 0x0E, 0x0E, 0x00, 0x00, 0x02, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - ] - - # Hardware reset - def reset(self): - epdconfig.digital_write(self.reset_pin, GPIO.HIGH) - epdconfig.delay_ms(200) - epdconfig.digital_write(self.reset_pin, GPIO.LOW) # module reset - epdconfig.delay_ms(200) - epdconfig.digital_write(self.reset_pin, GPIO.HIGH) - epdconfig.delay_ms(200) - - def send_command(self, command): - epdconfig.digital_write(self.dc_pin, GPIO.LOW) - epdconfig.spi_writebyte([command]) - - def send_data(self, data): - epdconfig.digital_write(self.dc_pin, GPIO.HIGH) - epdconfig.spi_writebyte([data]) - - def wait_until_idle(self): - while(epdconfig.digital_read(self.busy_pin) == 0): # 0: idle, 1: busy - epdconfig.delay_ms(100) - - def set_lut(self): - self.send_command(LUT_FOR_VCOM) # vcom - for count in range(0, 44): - self.send_data(self.lut_vcom0[count]) - self.send_command(LUT_WHITE_TO_WHITE) # ww -- - for count in range(0, 42): - self.send_data(self.lut_ww[count]) - self.send_command(LUT_BLACK_TO_WHITE) # bw r - for count in range(0, 42): - self.send_data(self.lut_bw[count]) - self.send_command(LUT_WHITE_TO_BLACK) # wb w - for count in range(0, 42): - self.send_data(self.lut_bb[count]) - self.send_command(LUT_BLACK_TO_BLACK) # bb b - for count in range(0, 42): - self.send_data(self.lut_wb[count]) - - def init(self): - if (epdconfig.module_init() != 0): - return -1 - # EPD hardware init start - self.reset() - - self.send_command(POWER_SETTING) - self.send_data(0x03) # VDS_EN, VDG_EN - self.send_data(0x00) # VCOM_HV, VGHL_LV[1], VGHL_LV[0] - self.send_data(0x2b) # VDH - self.send_data(0x2b) # VDL - self.send_command(BOOSTER_SOFT_START) - self.send_data(0x17) - self.send_data(0x17) - self.send_data(0x17) - self.send_command(POWER_ON) - self.wait_until_idle() - self.send_command(PANEL_SETTING) - self.send_data(0xbf) # KW-BF KWR-AF BWROTP 0f - self.send_data(0x0d) - self.send_command(PLL_CONTROL) - self.send_data(0x3c) # 3A 100HZ 29 150Hz 39 200HZ 31 171HZ - - self.send_command(0x61); # resolution setting - self.send_data(0x01); - self.send_data(0x90); # 128 - self.send_data(0x01); - self.send_data(0x2c); - - self.send_command(0x82); # vcom_DC setting - self.send_data(0x28); - - self.send_command(0X50); # VCOM AND DATA INTERVAL SETTING - self.send_data(0x97); # 97white border 77black border VBDF 17|D7 VBDW 97 VBDB 57 VBDF F7 VBDW 77 VBDB 37 VBDR B7 - - self.set_lut() - # EPD hardware init end - return 0 - - def getbuffer(self, image): - # print "bufsiz = ",(self.width/8) * self.height - buf = [0xFF] * ((self.width/8) * self.height) - image_monocolor = image.convert('1') - imwidth, imheight = image_monocolor.size - pixels = image_monocolor.load() - # print "imwidth = %d, imheight = %d",imwidth,imheight - if(imwidth == self.width and imheight == self.height): - print "Horizontal" - for y in range(imheight): - for x in range(imwidth): - # Set the bits for the column of pixels at the current position. - if pixels[x, y] == 0: - buf[(x + y * self.width) / 8] &= ~(0x80 >> (x % 8)) - elif(imwidth == self.height and imheight == self.width): - print "Vertical" - for y in range(imheight): - for x in range(imwidth): - newx = y - newy = self.height - x - 1 - if pixels[x, y] == 0: - buf[(newx + newy*self.width) / 8] &= ~(0x80 >> (y % 8)) - return buf - - def display(self, image): - self.send_command(DATA_START_TRANSMISSION_1) - for i in range(0, self.width * self.height / 8): - self.send_data(0xFF) - self.send_command(DATA_START_TRANSMISSION_2) - for i in range(0, self.width * self.height / 8): - self.send_data(image[i]) - self.send_command(DISPLAY_REFRESH) - self.wait_until_idle() - - def Clear(self, color): - self.send_command(DATA_START_TRANSMISSION_1) - for i in range(0, self.width * self.height / 8): - self.send_data(0xFF) - self.send_command(DATA_START_TRANSMISSION_2) - for i in range(0, self.width * self.height / 8): - self.send_data(0xFF) - self.send_command(DISPLAY_REFRESH) - self.wait_until_idle() - - def sleep(self): - self.send_command(POWER_OFF) - self.wait_until_idle() - self.send_command(DEEP_SLEEP) - self.send_data(0XA5) -### END OF FILE ### - diff --git a/etc/examples and tests/epdconfig.py b/etc/examples and tests/epdconfig.py deleted file mode 100644 index 78ff647..0000000 --- a/etc/examples and tests/epdconfig.py +++ /dev/null @@ -1,73 +0,0 @@ -# /***************************************************************************** -# * | File : EPD_1in54.py -# * | Author : Waveshare team -# * | Function : Hardware underlying interface -# * | Info : -# *---------------- -# * | This version: V2.0 -# * | Date : 2018-11-01 -# * | Info : -# * 1.Remove: -# digital_write(self, pin, value) -# digital_read(self, pin) -# delay_ms(self, delaytime) -# set_lut(self, lut) -# self.lut = self.lut_full_update -# ******************************************************************************/ -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documnetation 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 -# furished 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 OR 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. -# - - -import spidev -import RPi.GPIO as GPIO -import time - -# Pin definition -RST_PIN = 17 -DC_PIN = 25 -CS_PIN = 8 -BUSY_PIN = 24 - -# SPI device, bus = 0, device = 0 -SPI = spidev.SpiDev(0, 0) - -def digital_write(pin, value): - GPIO.output(pin, value) - -def digital_read(pin): - return GPIO.input(BUSY_PIN) - -def delay_ms(delaytime): - time.sleep(delaytime / 1000.0) - -def spi_writebyte(data): - SPI.writebytes(data) - -def module_init(): - GPIO.setmode(GPIO.BCM) - GPIO.setwarnings(False) - GPIO.setup(RST_PIN, GPIO.OUT) - GPIO.setup(DC_PIN, GPIO.OUT) - GPIO.setup(CS_PIN, GPIO.OUT) - GPIO.setup(BUSY_PIN, GPIO.IN) - SPI.max_speed_hz = 2000000 - SPI.mode = 0b00 - return 0; - -### END OF FILE ### diff --git a/etc/examples and tests/photodisplaytest.py b/etc/examples and tests/photodisplaytest.py deleted file mode 100644 index ae150a2..0000000 --- a/etc/examples and tests/photodisplaytest.py +++ /dev/null @@ -1,58 +0,0 @@ -#!/usr/bin/python -# -*- coding:utf-8 -*- - -#this script takes a file as an option and adds that file to the db - -import optparse -import traceback -import os, sys -import time -import uuid -import subprocess -import epd4in2 -import traceback -from PIL import Image,ImageDraw,ImageFont - -#generate unique file_name -unique = uuid.uuid4() -unique = str(unique) -jpgpath = 'photos/' + unique + '.jpg' -bmppath = 'photos/' + unique + '.bmp' - -#take photo -try: - result = subprocess.call(['raspistill', '-o', jpgpath]) - print (result) - -except: - print 'traceback.format_exc():\n%s' % traceback.format_exc() - exit() - -time.sleep(3) - -#convert -size = 400, 300 -im = Image.open(jpgpath) -print("opening...") -print (jpgpath) -im = im.rotate(180, Image.NEAREST, "expand=1") -im.thumbnail(size, Image.BICUBIC) -im = im.convert("1") -im.save(bmppath) -print("saving to...") -print (bmppath) - -#print! -try: - epd = epd4in2.EPD() - epd.init() - Himage2 = Image.new('1', (epd4in2.EPD_WIDTH, epd4in2.EPD_HEIGHT), 255) # 255: clear the frame - bmp = Image.open(bmppath) - Himage.paste(bmp) - epd.display(epd.getbuffer(Himage)) - time.sleep(2) - epd.sleep() - -except: - print 'traceback.format_exc():\n%s' % traceback.format_exc() - exit() diff --git a/etc/examples and tests/rainbow.py b/etc/examples and tests/rainbow.py deleted file mode 100644 index 8c1dc97..0000000 --- a/etc/examples and tests/rainbow.py +++ /dev/null @@ -1,20 +0,0 @@ -#!/usr/bin/python -# -*- coding:utf-8 -*- - -import time -import buttonshim -print ("white") -buttonshim.set_pixel(0xFF, 0xFF, 0xFF) -time.sleep(3) -print ("blue") -buttonshim.set_pixel(0x00, 0x00, 0xff) -time.sleep(3) -print ("green") -buttonshim.set_pixel(0x00, 0xff, 0x00) -time.sleep(3) -print ("yellow?") -buttonshim.set_pixel(0xff, 0xff, 0x00) -time.sleep(3) -print ("red") -buttonshim.set_pixel(0xff, 0x00, 0x00) -time.sleep(3) diff --git a/etc/examples and tests/upload.bmp b/etc/examples and tests/upload.bmp deleted file mode 100644 index 845f1fa361b99390340559b8494d819563b5a71b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15662 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 a`syOUXA`T7kqG3G(*D(YSI2(&*Z&_d=`NE1 diff --git a/etc/examples and tests/wavesharedemo.py b/etc/examples and tests/wavesharedemo.py deleted file mode 100644 index 4195c3a..0000000 --- a/etc/examples and tests/wavesharedemo.py +++ /dev/null @@ -1,71 +0,0 @@ -#!/usr/bin/python -# -*- coding:utf-8 -*- - -import epd4in2 -import time -from PIL import Image,ImageDraw,ImageFont -import traceback - -try: - epd = epd4in2.EPD() - epd.init() - epd.Clear(0xFF) - - # Drawing on the Horizontal image - Himage = Image.new('1', (epd4in2.EPD_WIDTH, epd4in2.EPD_HEIGHT), 255) # 255: clear the frame - # Drawing on the Vertical image - Limage = Image.new('1', (epd4in2.EPD_HEIGHT, epd4in2.EPD_WIDTH), 255) # 255: clear the frame - - # Horizontal - print "Drawing" - draw = ImageDraw.Draw(Himage) - font24 = ImageFont.truetype('/usr/share/fonts/truetype/wqy/wqy-microhei.ttc', 24) - draw.text((10, 0), 'hello world', font = font24, fill = 0) - draw.text((10, 20), '2.9inch e-Paper', font = font24, fill = 0) - draw.text((150, 0), u'微雪电子', font = font24, fill = 0) - draw.line((20, 50, 70, 100), fill = 0) - draw.line((70, 50, 20, 100), fill = 0) - draw.rectangle((20, 50, 70, 100), outline = 0) - draw.line((165, 50, 165, 100), fill = 0) - draw.line((140, 75, 190, 75), fill = 0) - draw.arc((140, 50, 190, 100), 0, 360, fill = 0) - draw.rectangle((80, 50, 130, 100), fill = 0) - draw.chord((200, 50, 250, 100), 0, 360, fill = 0) - epd.display(epd.getbuffer(Himage)) - time.sleep(2) - - # Vertical - draw = ImageDraw.Draw(Limage) - font18 = ImageFont.truetype('/usr/share/fonts/truetype/wqy/wqy-microhei.ttc', 18) - draw.text((2, 0), 'hello world', font = font18, fill = 0) - draw.text((2, 20), '2.9inch epd', font = font18, fill = 0) - draw.text((20, 50), u'微雪电子', font = font18, fill = 0) - draw.line((10, 90, 60, 140), fill = 0) - draw.line((60, 90, 10, 140), fill = 0) - draw.rectangle((10, 90, 60, 140), outline = 0) - draw.line((95, 90, 95, 140), fill = 0) - draw.line((70, 115, 120, 115), fill = 0) - draw.arc((70, 90, 120, 140), 0, 360, fill = 0) - draw.rectangle((10, 150, 60, 200), fill = 0) - draw.chord((70, 150, 120, 200), 0, 360, fill = 0) - epd.display(epd.getbuffer(Limage)) - time.sleep(2) - - print "read bmp file" - Himage = Image.open('4in2.bmp') - epd.display(epd.getbuffer(Himage)) - time.sleep(2) - - print "read bmp file on window" - Himage2 = Image.new('1', (epd4in2.EPD_WIDTH, epd4in2.EPD_HEIGHT), 255) # 255: clear the frame - bmp = Image.open('100x100.bmp') - Himage2.paste(bmp, (50,10)) - epd.display(epd.getbuffer(Himage2)) - time.sleep(2) - - epd.sleep() - -except: - print 'traceback.format_exc():\n%s' % traceback.format_exc() - exit() - diff --git a/etc/sleep.py b/etc/sleep.py deleted file mode 100644 index 7bf466c..0000000 --- a/etc/sleep.py +++ /dev/null @@ -1,20 +0,0 @@ -#!/usr/bin/python -# -*- coding:utf-8 -*- - -#this is a way to manually sleep the display if the code crashed before the epd.sleep() command - -import epd4in2 -import traceback -import time -import signal - -#initialize display -try: - epd = epd4in2.EPD() - epd.init() - time.sleep(2) - epd.sleep() - print ("the display sleeps ZZZzzzz....") -except: - print 'traceback.format_exc():\n%s' % traceback.format_exc() - exit() diff --git a/etc/welcomehome.jpg b/etc/welcomehome.jpg deleted file mode 100644 index 1fcb16bcd0bb8b4b52fad051441d3de3f11fcc20..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41278 zcmeFYcT^Nh*EiZTWF$yZGDDJ_K^W2yBrp>;3M!>#qCXeG0n!*SmM^+Iv@Z)vl@@^cZ>uxUQ1s;r~$0s7yzC@ zX#U_V2>ahWpah7(@4Pr5Ujan$Hzo&hc@z@B{5x;!W7dB#_FIq!$a;9V*aJvyYde^> zm-`jvO3SMf|GEkY@(S|`0DvIB09;%^KwMA+CMYD%4;L5a2LM=j`ahaLmBTatVC~0D z|Iz9(+u!&U01^P;N;^z`K|z58jDIwQ8Yf`>!7hoAzjz=}3?K;t;Qyr!G&BkNNB-j^ zj6d{*B+NfJEeYrEvOvEj;r)%TgBbr$-kc=z-*nI;(4wRVS7l*51M%CW#NRq#iiijU zNlE{~IsfP^z|Wrp{l|Ndu^fzlFx2n$&A-b6Ya#b9{jX{q$bALwBJ2zgr3nsRa@tVA~}D zOTB8PS7qaa8i9U<@`88(FvGtv>%Z`=e_^(N+6~5UKiYV>AiaI~`L#%( zKm?EuWB?xkUtk=dgeXF|Aa8+cpb+Q)+JQhI2Y3vm0*SyEz!^{gfHvmARBlAJOd?Macl$HkQB%;bOtH``2l7r~%-Rrw}`621Fj}0BHluF9-60m!R%8pvL!r5+D$Q4Gn{`Lf}wmNC#L( z2`E1Wd`nY+EYM01U;vT`fkKi2MQAGI7cc@8fwE)3vNM2JKrXNYR6q&=bKntB1M1NZ zYM&4476#cz0|LMpunU&d0#t$8rT_L$%J1hhzzv8Hgcx!ORfh!q)~^JV zn+_y_8m5DKJ^-eHegFoE0DC}jNGIswa-aY#I~n9i1Fwz0{hk9+hSUKekXFz?xga$O zEI%H!APwjN&cNL5kQE3ibPG}o6oWETK+lAOMdH}OHb+I!ntyVx7p zd$`*=U5AhX03nyM(8NtriS!=eI)F=Zla7stPfY4BfxkP8D|pr7|D6y3z%T}2U-v|x zox=c(vnVvWJrTgLGW(ke!fz)aA}S;(02i^d76otk|F;D4F$x|4IOv@}*T4G-@X7D~ z;{Q4Vz-+8-@4;-XUG2TBVPMZM;_3=>;1lE(1VF9-@&hIm?Bzg@T%Dns;0Z)mV-xt+ z;`o8*-*lrZI_4jG9Eh%b_?I8Cf73yXQvkmG|Ku$P2>!~ec9oa#4^Jmp@^6{?S9Fp; z^j`4o{|}w=4}Aon`%MR}!hDqKRzwhedYVTtWyYK4a<}H3-is`p-aS&gT`Iun8 zS$ytEF&S%U!{pt)>|r9{xX#Z6=Jv945ZAq<_;+6LPKxPoCH?*VdHscW-Mt+71mJKu zAHN`*3`ChSyi|IkUfy#}x*rX8^eus1%4ZuCU`@ z`0W+8`3txI=F!)c2YJRo46}8z24z5wLCkIQFS_Hu@ZaTvEWoupNN*1p>j0Rx(ADk# zx5>x;K4=F3$h&(4cp)8~d|-dAt*E%!@^Zt#3Ka!_E1&;W>YmPTUqWtt{SPf-8UUo4 z&}j6>|Ik#M0H6}giC_O88oL-cVFKqt-Sr;UUe>?mfwMFK>Hw}k?iPZREE51A>j(3g zc{>P!Q#>$12;{)&$`l&CcMF_9B?G`k0vdhx8jZfl1*dqE0MP7)ZU#tjp?;7t338}q=t|b#b7MUGYal~4IE{l~U_dc3u&}NgHzfFKi4T(mip}U+3oK7Zes1 zm%MvlRb5kCSO1~4t-YhOtNU}$;Lz~*kV11hfl^iHU)Ub7dC<>VIW82__b!05++t4vw`a8IxcbF1cLdtI8HU zW+B~e3LCEh{2MI7v#dK;rv0|;|CwRo|F10jW7vP}ngHa1Yq+@AuV2Rp|8ep0@o{Ov zJ6t>_LTWr(7&VNOoraB#onM%rkzatHjYdozE+!@`hmhprR900`R+dqbR6&D6AOwVj zq{O5YgoG4uRytO2ns}8I6u^_B0$k?m3WrPnK7(W_xFVRY?yk<_(jY+p1Si(?=y8Am z16)!d!5{$;K)X)gye^4K9P(%UU|pXw@G5XHT6T0zC3Jo~LiVys7cxDPpv_?zim$cz zjRzX`Bz{p9i=8|?0iRt8MXSx8C!n0yrRsljI>^2zgN3P^y{00AD}I$qPwY zRo5m2dy41eIoeR0=iB)m(9r8c3h*L^kx(-75%P0ALg4nRx-JIQteoto!B9sAuO_Kq z`_B<&zJ5GubNl=er$$_Uh@c0E@t^0VMT32tJZNC;Co0uP|5&F_&CiTn_b{*AJ4b$E zMOlMKI32j=yVb#zk-YypmDrLahgL~dQFwj70C6&x_Na?|tcz_-uNQvm@bczPhz~$t z#jv6}eSb)3B=pA1I25%<-nm3S1|^Eq+A@`w1AqCXAJaIe4B;rHM4tlLIO)g0%^{M` z-7QR=OD5lBx@9G+js_5_Y4M#e;u`!nWC%Kx;`h>1_N9kgh6d9j!=@9w$Fuv6vM*1C zA*X{IM;9Cf=>8t2unUeLU5xY6$NQl=lfj-!6(cE!hwwb0E#fofaz6RiDhCz-O+lGr zK@%Wr3OJ_&D+jM)OtDzm*A6K2_;UtU)J8(dsb#0vR1v4cL})-&9aC8E@m$hFD7Dpg z2eZyd8iYLJbf{8UEC;ItV?{HM96-f!c*^AGdr%`ev{23h>Q3r)sv*BZ% zM|@Axg~v^0jp=YX^7KO24sxOabzSx~Rh->I*xJdE+;!h`4qBhnp^ul81zEXk>T;sw zl|Be_U6nf)2x`D{?N|@DLt-SMA9{!esGXw&Xc_XE;@BadnoLzg#D`?oF1=;&PD04j z3L&H835P4ABcXK*~9WaP8mKafrO#&`E`Rf>M{#Q|Z9USB& z@{}nyF?x;CRiSbm&AKF-bU1^d*YPC=_wsxS&Cpjt}6TNiuBCABZHDpnZ|QNZzKdL>#&HT%NZh9=tGa~*lvWUhx}H4;k0Hm@1uA=M$! zhlq66Kg(TF2l&`_^Q?!~G|8h*m%?z{A{4lYs%+O}@Zt;eMYKk@3&S)p&Yd7R2l>qT zVnjG2331u#)R;na64Y*-nrPsW$cOz-sUphWsVbCSv?;NBZx~7K?B}k*gm`ONhJ|RW zz5N1c5q-+06h}8=ylW)03Kf{ZfFAsohZxLI8rsV%CmXyD)`d#4CKhz}d zJXFk2HW)K_8tf@c9!VbgEI}J`DO`9uXp$uLliDT#Du3aSB~}YV98tY#bE;h1qTC$<<2H_a&(TU5>ndvz@%IRj2Da zn!@4Fs~Kagm4o(IG@Z398#%&A5MRg##e|n=spYT{1UoW9N#9ZPOYZj&J7pG_sN9yz zJ%-^C%~CYLpm$~(W=2if(b!bSbDBPdg2HFP8W{{b|HXVVIQLc@ll)=OV80V2JVRno zH~Mb-!Re6f!Ud$^4Wcm?M68H`rNSm!W-UJd7lD z<$~RMXeBx!F5+~*Kwx>LLjppnlQ>GXp;qO`# zR;u{eee<#kf*$JYU?$2o_1rkv&vP#foRtzNNI~YoXc`U{+DR%5ovZj#CB4@qv`0Wnh zTE9;GX!Ol$+RG|{8fmqxOQLSQ1sd{rCYS?9YbS?PX;$s{G6h0q={@1DN~og2Tn60E zX#7;oqP^KC)>SC{$U}K8vTGz10=}x`TUvoK0w4N=F4(seQLSktb#u9HQPGLtM54$c zU8`N9qKJcaM5?RP^eRu&S{BN*?K`}_@$fN<(d<<0qNC!%1G_f6H7*cEBTUGPBu4c- zKNm2jgF2)mopP|jUJ~i8j#*H=u%l_)AtG^se0(nprJ6F#Gkvi>+!;zuOu5PdEcgn~ zq4bo+`=MDmy4jc2!Uy?Gp~P1CjI=&<2uJRnYs_vcff=8 z_UFq)cebJdLk8JSv7(9M^OItUc+^O)^%vqm8%pt`mGL~w>3QYGy|qcbovg9>>Kl;x zAh5S*HkFB|;mj(Bgg*oOJuX0=T!URTkS;<@#59+(Wf?-=n<{gf2mKOLLd27Tro^#JX52K?$`BLP399_ zYMOk2v7iD~CNZ?4oEzVn7U|DmnlkKIv@(*%lr{#@z{noS?$?uD+s~29${lkEM+)@? z5&}4d^U=h6!j1=X;cy03z@rdjG%k0ypdZCx$qvCmSt~24;?DFFp-%Vv(=x$f$B8!k zOPPdZ*0EUL!P-a|p4j~H0%d}!@EQUuIr~QpMJsWIe1fA@CaCoxB&FSxI_h+7>nLiM;ybeKNZS_;Xd_a+K17{Ppn=m>M80nz>a+;4 z7LEourwUtRI3DQo&_{vqa&Ef$c1UWk4*bx_j66sPLq4i)Kqb#8pNOYpl;>o*Zf_6P2Ww(1YAQ%St)EkN6@yJtV20STw&D zO-aVF)v{by=!ORDQJhX&UDdq7#Srw!tF@`Hkqj-(pTz}r#M+umsULOy>E}}7vP}U` z+CaU^4#A9qgcej{A;w4oICKUMLWp$^^7Gu+d_Y*mBH zs;8RJP--L+_X4S$gB`a|EfWB~Di5^@u^;B(5SL*m1_dLLq11sxo|-w(ltJBeZm2Fb zyD)^jQEBicn^qaTkLe|!W@H$x6zJb?@|PdLid*AGd~fSJuf*9e*E|n7(nbU2FIM); z--E-e0r7fTJB}cM({yax}wX-m?6M>Xhp->a07fX079ny zbEKB)ofUO?nFYP^H1VPMg90EV<*{_tx(7=94j8uS0$rx^=k3Ii z6_&(Ss=Tq7bXp^c@v46Of%L(}ls+>D`}sZsZ%~#<&-3E1QpE!6P7tH~JG(ofLVcF4 ziPN=TC20K$l^DGEB?x>97;^(QWzI|F3K@c14)zO)QgZV(Ivu|FvnUaC2McBgX1bQ< z(!C?*crvrhIUVnutQ+w_tE-P{PZ43dJnRVDXDW7PE@fLg)=fT*?i$>pWMJ*p&tP<) zJuC}Ux4l1KVd`0sHN47;q5KMoqILzuGdKv@g@LN76m94rICe`{XTEWEcU^Fe6Wudj z{>oy@pqf{onebA_$RX_YTPuqUf{U#FBj#^#hDXR>qf3jd4tL~|PpsIa!Y-=|-#ypk zbESXS3orOQwEfN8X|xEIIN`?e5z;(fDCw>A-sZ5ha(NW2*^0)+E-h;d%NLg=^oYet z6lX1OsRr^yGI&)I+{DySzg6hOa2e2p zm=T_Sk2v2=zC6i&;SXgVS~FPqs7*wr$>4?~;&2anyN1b6>=!nNSsU3k#=rtRo`%_a z$!}#5qw(7JnJY|@(>5&Y29f)>;Z#RkMsx6U1v~REjo;h($Z*5q{(V_WJGQj6wlL4m zdzQU7NeXmo$-mv&s2i&1%jcut=ZD3VOYA8+v7`I@KgbN!N#Sdi;%;7zO;f|Jwv7kfV10A9o#R*RivC6IC#%OXcV zsj~~q>Wha!hNEyKd<=?HvXrXTzZV_JPD$FwmbT#9I|)%^am~ofGV_sm?%@n1KE{lf z{qVXzLy5}m8bhl0%X?btbV_YR;Y{ezGZyIg+k^ z3(PO#Y!{WykmOKt2W8lbkdI10AY(zk6RNsiHn%3>D=ia)InNf25bST-Lgp7Ovg+-7 zk&i4osa_)I7o|8(V?K&y;b%NGOZrTxgEu6l&pwmwaPj8xN}{40=pu4|I{tdOZzQd}*d$c{-Y?@UHU`VgsQ^Tvl! zF#uyUY$Ua2XE!W4PC-zg8+%0HLybHnL(e8!qa{C)#;NsjvJ?Hmqjq(YfEjwB!SK=y z08X`_cPqA+T9l-_;lYb0B)hy@5DIT*;OJ7VV9|q4>32WwVo{^N z_%xRv$rFL~V?yEyYL2ZDO7DjT{Ilw5jVR{*=bFp$2#&jUXz^EBYqL|;QjN{d2JCa` zLr3}MmBY(3a$igEAvU9bz1qp;Y`O+FYS1kt_{L0t)y4Edi_m?Sw`Vrb?ClI$>@?Gk zF@s~*x3f24N#wg+dD}%7-}~n;5x{b7H&?$S6YtYQ?@FF>QeBTJuZ`=c7tUYvQ@x_; z`Zw`4Mb8YL%ZS5mh!MP;+>RIp!9n`u`es9n_|J|=?9MmDUGXkOSX+D{iIS~lNiRBg z3@rd4%Hd$LE>AWI+cRsq8qkef%)fgBZ%+1$@LKIQ`B{|D_-CpVK7wcu<-<~59Gm6r zdCEK)yoDJ^wyBIkxL->A1uQF^@w=x#)9#9??NLq*KCE!kUIfuDU#|||l7I&N5B22N>X;LvSHsP~ zPgx2;4~%;OHi3|ICn+gH8Q0IuKJNuFz=6=vJO;(f)gmR68cM}XDIBp^6!O*Ung;hP zO&RaOtepj0Zvr1q4+TJ65yQRo_H-HC8F!=m?li?_^Mtb`-J%;zBX)pPPP?rK8eCJ-9_m?-&J8!8 zchfMrzHVat@iU{G8X|=2)-3T4$KbCYJrjtD2dlzAz8xv=Sj)8hp>!T>maScpZ2a6b z#YLax)w>h!`_Q*6Hd?oyi7fx}v~YfCq^F>A+nuF{lCCAS?j&Hs=yhE@r)VhTGxzQ2 zjwdn`%~B^@T9eW)sB1RKue0@hW&L^5`afor4=&?K1(ZIsq!SJC&f9LS{IYmH@Vt+~ zw8wCzf7D=>Dk?dsk7ODPe#wwxP=a)}HBEo$_CoFQdO!dg(5zX$%ETiaNOzI>!lCFp;D z{WEvMCxH~IDXESd+b)DJ=#Bg)zoLN-^JM{RW7~p&tzJ(4=FP6{n(+#rkI!yNytq3R zayN(H9p#+FF2_4i->63W{HV}_bxNQ$vU|y)G`zQEd%r>{ro`9_AKM zp~-bxBWc$(f(@60)=uy9(zn}E@2ZT>=C~Ec!y1+6@0O3JlG`kJ%MpGgyH?DwU}pAs zf$biZ;tjqBN5#uV*HW~5oA?Pk(SY;BZ2@pygcY$(rtFftMPR#1=yhT5`=qII4?bL< zBuC*|&V+gXO?(3vQKsQR3v_?{VdghEe}BI$*Pi%%C+0$d!S?Cp{f^^uWU#9rvCUb= zxwi@<#`>OI=wi$~)gk#>>{|7p5bsc=jE8ZM;mW(HDuECVnfFf{__q=DYHMn5gK#FB zqfJ$+C2$nxNz3Z zt{!AnlzbU$!>?t%qS@W$TGvP6CBf3HZOl&N3C=+56vg(+YaAsocJ_-8b-7+pTmv91 zw#>za%Evfj7*i$3>5JSm(eh-y@6Cggor2SPk}tTDwMa_@lkeR>3ouCEV+>v?AqyPS z%rjiJV*!fTu;K=`I=GrNJygb}))HQJtii@zXfPK@e8Y(sbrj|jsaSq|aha|!Y)Z>C#4Zj8Axz2l>GzayOcmzCDzI)i8>*IHdZ8C0oJbLlr1q-(Z zeQU7x#TyNB54F$`dnu0mFc!zuwGERYRoaNk#L&)Pi=3V^4Z8z1?M>;U-TLh`o}Mg$&xPy8K^$}hF~F*zCQhRw zD^MhPgO+Tn{@1~cn9R4W#9A3iN^4rlh5^_kkw2rRX0yA)|3<9(2cYjXgHMx8YEyXmgTCo_(HvPUbSU#3glrU7G^)M)&TCO=Nde(3%$p*5XrESR+26Ph#ha&p6O z!oo1^sO4q3HZY{ru;}+o0#@NOj*W89obv<(>**vvUvn+CgtcLM1QQ9!V8%gY0^i%D zYO(ltDk#yVzhV=Vn0H&T@+4p3X^Ww2qYaO(D!Yy0Mg!Lr6~2>UXo9U~);-`4HxCuh zN-ZTUDNvsJ8dw!um;TwfD}5lD>3oUbHaO3qWi7{YJR_#RjxB>04Uk@p8~asE-Idsz z`tbCdI8Wi?mxIYJPxmr!GDY~w&4}prShLiP4Bwj@GIl(ZoP{ysc4a0t>C81E&%Y(c zZQ}5mD1Zy1_|eq`ikRDUxm)y}LlI_5h6&typE{OnUmnwz(0{w3dcjq;onb>0&_aJV zYo42BUX1chs+1Vcs*studd{5_2?MuiQY}p^%Cs}_2Lpj|dfo%+_h|1%)EH{}V+MS_ zW*9pI$A-zyg#UDY`0k;3lHepe&Q`j2olcTR{X*9F#WQ4io)_aRGbY`;ccpH)L!_@8 zM%z#G+n&9#`Mu|LXdoeWnlP(0abvLYTH9V#jp>6Vfg}@G%(%Yqu>tI9LhR~UUMiI1 zT*K#Ll*n=0lA8wAi%Poiasn6qyKg?c)OM})bJ+oBu=!m>yCrJ^36J79QXIL5ZvAYU z*XxeMHV_reoY11VDD9~q!=cZ<2ozXHkZ99fElJ6W*U!92c8WiD4qy&0bUF#0XD++F z4(U2Fx;!bp0dspEDlOaZyD;KEZt}^XCet3l*W1AM>7HWet*^Oa?l6M+Lbmi@ZD@eR z{7D&=fAqHzQJ0t;tPzc7dQs28e9@%%gddti@z1%AXr_g~EZD~pw%`1@cU?TgDA+yh zg_4g={+D`#8+#pnUx#8a8Ab}S??V#(Q(aPfMWZtkClImFhPIqS+AU@Pmd-+3nPw~9 zn(blX(H&_~NKgWH=LX?QO><6^Tj0I`G*7T0>J}AaY=E@C38#Le@ryyj-P9c>iTx09 z$B_cDqjL@8N3s}<%4opJ;luW{Q%|96&7k|_mu&X)64m*yM@4oGcX;1bDiSBwtB?|n z9hCk+14JB}h#z7rbw1^7WYIh8QR{}T)hTpFfl;(!i%q6`hcC>ywb%|SGdGpC+F?$*K`MLszF1^~WKPj)-+U0; zPt{RjXn;}aoGBUOvTSrETB=GSd3|xLsX&!^vL!;=2!;nEbaiJu1VpM_!G@dwstxZqiCYAg8z%`mLWj4w;%{ z@rIWBPEtc$%ATX&4=hIOQ7lM-NbG>2MI~oqEq;#9hK*QD!HeXjdGOZ*f1W_%ulIgO1%?$FymbxcfOakU()U+NJDG*q<{H99o4{2%`!cu)f1MC9u2j_gR03i8-O`L=mf3*bRlga5`X8eK5A{vEWCu8X zm(*HGlBS`9!R-&Q!TpC>bKj}PSZW*&UCU~nEb1|a;1`5e)CE}%HwIRox-E*fiStYJ z5(&jAdIVmIJSQr5t&o4}pjhotlb|s&Bk-B({PF%=HRiZl&#h>h_Qr$&=a`rqH<&Aq zltNNh6lsLx6r^-rR9RTgNI0W-<#8g2llv#iU%Mz@c za)4*I;=y4B-m0@syxJq0`|(S(vAxD@{eBgO*rT`cI|(ttWC$D|YID%ca{QrWWuCs)$~V=yWZ?Gt zKv=r>Q)=IFxnQO2d#B_+7PlEuI?khW7XDC!xesQQyOeh@pGk-ApF77tp=x*vowtki zPy<3%IPX{JHa2F&aO`<^E{o9a)?YjHf9SY`q@|a_DbwPA0DWolz1Gz>_VPQ7xt7)+ zUWmUdMYNmerM%#P9Y((CE)d4I&T&N3ITCy4krunAX!Kj<(_kdFbd@>&+p4%9PBFN- zxwq$*&pEAq7jKZVeA3J8-sx)aS)lbP#yjU+z*(f9G;*NXpwj;(_~U8p1Rcevtu%h) z!1-#!q^&OwCd_rc>&1~wbFvp)O2UJ!AHJ$v7&<7IWu`C&l}#953`BH|ypMZLY!5E5 zmK;5yyW_X`$}H?K(xTk6YF+Y@qC1LF+Y!foF#CPXK_cnPr|(3+9rt=Pio4~x-tpY6 zurh7lqdDu$Y0PYQF;q0ffRkT5lpxz+@oCe=kYwxw_tA&Ly72i0M(W6lCVkG-r$cEk zQ?kcJ8TR%NIn4~STC3aZ^n(_?$IfDX_+H-od6)fEy<}qNrQw(T*_R=O2OHr2ln#j8 z#OG@n@)?Zc?;gIB7%09A*=6vaN_XGOB6r*`C*Iftr%PW?dd1_n^Ur+H04V+9U@-e_ z)ZN3RP5&r8aQ_CGJx(WPNfbbLFY?S~dT$40P&@qGv^8pkf z2jF0Y^%GUMUzA&&Y>BF0oIddPg4ULT!*Y?&i zLu@|0)WD}uR+(Dg!Rho6$7hv*#`dbI4Oq%i%NUTmkBisfteB$4wn6jAz(FK^m4GDA zYyFPZWcCNCQZ|pHH{n@LhHSmQe8hyR5yW`vR;iA$k|+L* zM0#3D2j=kvP-31GCw5NmWvgq)_!YyJ-R3x!u-N?C`Qq}C&DvN2?#%d}oD!lvB~dKd z`O4<(SnosOVk?@v^AWyUW@0~M^}4@%y##4`h!j{fs{%CiA1oXeQmvpF)Q zNu>NL3nlZymkqYCoxVV9!+ZG-ca%&hGrPXP@i_)nZ*K9+v_-mMDKi?J6_qCUe(yw5 z`4doJ(!-a+C>Ily&*)69dB0t-8`@tn+eqS*HafiTfxnYE3GQbl9Rj(F2Idcrbz;6V z2eFu$iad!ML_EOjqZm@j8)9-^lP7NP24c2YY6{tU7#Q!1iESLb`9g&Xa?jY|XJA@x zR0t0CeL$E;f-Z!srhMT`|Q%TaqH+sbh=A}<6WR62h zDH;!@4eq5aF6@8hFgISfc%p3Bn>zzGEXf=#e#rWW$#ao;GUdAKKlA!Rb!znTev90yQCkjY6dItV zSlv~nuy`_F^ymp2Wd-Zbo7^+inIwIwH(Grz#pRP^7xVl46(JVt)e3;%qZSFxNe?HS z3eC*b;yNJbXWjc5EJR>lx;mf&!~R15@!nWvyXM;mufE${YeJ5kLKxi%OSHA_C` zWj4DXX<#}gJ-IhhIkik96Ws9G^yg>yq)#@(1_W~|GIN6HUO-gsUn9kbDz@+}TlxiCo(z^rda)X0JxHr=ws zi&Z^3(|xi_6!@Mo7ajs?tJ{~lBfO?BD&~Ss@Eq!rB#-V1TQ)uNZz4Rn_q1sPyY5AS zQ!6KFmft4h-w&-kaM_B7 zkLzKKS1USro+F9(^4%A_5Ax3Ygxkr%S2<(oZLq{Z?TJGIE{>KbxF3BGj5I(HgrsaV zN_b~+giZzr2W+TH1S2?g1yr#GF4(VUUsjZfq0F_x4`x>Dn-4CWFccB>4DW0*qnR04 zPzSx4%DE;=n|WYJXJown>5E?sw$m)We$CH$X#HJ;FIzwU`uAp%3Yvz5$q};25gH0w zc(m8f8<>oY#o3d&w@oA`qe_9(AF?m&vc7)}L8Z#RL!iHpCT(1wJu2>0yk3I_@~>Ck zH7?~nn#Ayh7GN-HoxyWP``&-&YFy=DY-paDcZ$gzKCX4e45vIF+dnK0A3|LiFms9Q zdgZ9vpM8{kKT=@+i1x?g=bO$BHo0OBfZaNk zhyY!n9l;dUI zew?^kKZ_qv6K=&%>^%0uGcF^;bE>E>u)l%P#lA_DCWnhUc`>&Bb2D4NVb#Ub>nCnK z>q~q*-7N7hRQ5{}J4=4GinTF6!8W3e9<81Bri@!D~c9l3_)_+eE0h|}jE+C39+9%3mf^8X}I4O|-Z zF_#BWmT}2s)t%Dn>u2QCn@Hh55-aqHO=*+}bE?RDLNrTW%bJSnq6pL?QI=)6t4rzH zR=-p^Ko+09>(;c42FmVKcEuTcNO_xQ6uUDA%0Xv%1E* zB;|P}eij9z1b*Vo~Y_^_(>D zbBGs^) zERC>$aetTQ)n$>!*QhVO;%*Eh5d=!xKZ?0ukylR2tX28E5)t_+aNQ)4L+@E_pX^YX zlK*A7)e%=lO=3)3N6*r7x31!Y#0*DhL^h#@#_itRGhLq5uO%|N`MQ!^3zsR9T>_n7 z?s2&Z-BI=U;g;DbU|yH1Gfe!vmm60$bn0NG1E_r*MwKE*Nk(j`V6R)qCjWs_K`Jxm z7_$TKo*AacH0R^JhL8t_XdoN|&-Z%25=MYB?&Ixgp*`bPM=HXq`3%>I=!xx=?8fi7 zn2FRiI3d-UoV{+}sK2)=M(aHl&$TCUUBV@3^r!5+hta8XGkTbd+|##FnW|;{9#RC? z6d~I8@Xk$7?&BZeQgCF+oN*a#IK{%0D6vil#n0lN76s}1lk;WPa^Saav3$Oy zuyOhk)ziXaIGG3QvjAj67QmMEjD z_?ySxXDtbroi&y}iMJo20l)N`65KvXx0Wp>e)G;JtZY67tmD%9QHj~Q&JWZdzLR@S z(v5N5Zp;QTOg;E)K$9QpeJ-`io?&}2RP)gz?z~g)nwbx6qZ)3=!-zP?Rm=@vz z_}Ti?f|F)3fX&Kugobu+Qkx55{5UnX=@A~zgovjda5z8IC~ZI#m*??I!30MXAFA~_ zCS&+vxfb}vYpwZn9QsTorQHl~(09Cea680jh(PWYfzV_yr_b{AiVWd|N=yj(;rz&J z2e#4e9GU4yw>TiDmm)BX-5l%?Uv4;eU8hQyWmPM`(kO+$R_JqGSxCUjNGMNYXoGEx zExZH9&_^NMmZ+}NeY%vW_z3}S`)YHQrQ^8sHb{T5pze(bQwWraXaTnq~~SV0mZlV(-4D~x8u6dBO_$*-q>|; zM-N0|lVo`I551ZMe?;E8k&w6SRBEW>Kx5l?9>hNXi_?lLBgo-XpysHQT{N)}ANCZI z*cP|jeY@~ZY`8J7KG99PaahJ06_?V+pc5BGLEBcDe#9+p^@wb4C#T(Sw;l%R56Kt3xGh#YWmG()bXsh#cIK;|#wxBXm1@k5E$_8h zWtllu)+VB-B97)95szLPUN3sCCqeH1ktF;1R%obUNbxL+wvYwEN6FVr2g|6_-*ZW6l#(%5Q zp{z#n_qKf`>PkEvHhi6{F|45XW-`T8=wbE-L+=ZbE=>D)3j4H=q%CR!pIdE3C_`^c zE3jlXc$#zM*N=L0l5=15Nv%G6Pr27EMffgz+2Z2)!;JI3#pc2+O%0Drw%Yq{;U75& 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

$4q&q< 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 y7?C7>UHjDD+