From a4a012616c2938335516dcfafc1c6f56a4d9c4c9 Mon Sep 17 00:00:00 2001 From: Alex <constantingomez@icloud.com> Date: Wed, 3 Nov 2021 17:47:25 +0000 Subject: [PATCH] Updated template with more features --- .gitignore | 1 + Procfile | 2 +- README.md | 48 ++++++++++++++++++++- app.py | 66 +++++++++++++++++++++++++--- auth/__init__.py | 0 auth/constants.py | 13 ++++++ auth/ldap_auth.py | 43 +++++++++++++++++++ auth/ldap_handler.py | 85 +++++++++++++++++++++++++++++++++++++ blueprints/__init__.py | 0 blueprints/auth.py | 23 ++++++++++ blueprints/home.py | 35 +++++++++++++++ config/__init__.py | 12 ++++++ config/config.py | 50 ++++++++++++++++++++++ database/__init__.py | 0 database/db.py | 3 ++ models/__init__.py | 0 models/user.py | 18 ++++++++ requirements.txt | 6 ++- static/img/python-logo.png | Bin 0 -> 50806 bytes templates/index.html | 31 ++++++++++---- templates/login.html | 28 ++++++++++++ 21 files changed, 445 insertions(+), 19 deletions(-) create mode 100644 .gitignore create mode 100644 auth/__init__.py create mode 100644 auth/constants.py create mode 100644 auth/ldap_auth.py create mode 100644 auth/ldap_handler.py create mode 100644 blueprints/__init__.py create mode 100644 blueprints/auth.py create mode 100644 blueprints/home.py create mode 100644 config/__init__.py create mode 100644 config/config.py create mode 100644 database/__init__.py create mode 100644 database/db.py create mode 100644 models/__init__.py create mode 100644 models/user.py create mode 100644 static/img/python-logo.png create mode 100644 templates/login.html diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..59ee0a5 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +**/__pycache__/** diff --git a/Procfile b/Procfile index 244c130..bff65d4 100644 --- a/Procfile +++ b/Procfile @@ -1 +1 @@ -web: gunicorn app:app --log-file=- +web: gunicorn app:app --log-file=- \ No newline at end of file diff --git a/README.md b/README.md index a7a88e4..4647bea 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,47 @@ -## Imperial PaaS Template: Python Flask +# Python3 Flask Template -Get started with this Python Flask template. +A started template for Flask web apps using **Python 3.8**. This started template includes: + +- Dynamic frontend templates (not React) +- Database support +- Imperial LDAP user authentication +- Multiple environments (development and production) + + +This template is useful if you would like to create a backend REST API, optionally coupled with a simple dynamic frontend. + +## Getting started + +Once you have created your new app, take a few minutes to look through the files to familiarise yourself with the project structure. + +- `app.py` : entry point to the Flask app +- `templates/` : contains the frontend dynamic HTML files +- `static/` : contains the static frontend assets (images, stylesheets and scripts) +- `blueprints/` : contains all the application routes +- `models/` : contains all the database models +- `database/` : contains the database creation +- `config/` : contains the app settings for the different environments + +**The first change you should make** is to set the `APP_NAME` variable in `config/config.py` to whatever you app's name is. + +To start the application locally, you can just run `python3 app.py` and this will launch the app on port 5000 (by default). +You will notice a message in the console saying: + +`WARNING: Could not connect to the given database URL!` + +To fix this, you should set the environment variable DATABASE_URL accordingly. If you have PostgreSQL running locally, you can use that. Alternatively, you could use SQLite which is much simpler and does not require installation. + +If you do not want to use a database yet, you can ignore this warning and delete any routes that interact with the database. + +If you navigate to `http://localhost:5000`, you will see the response created by the route defined in `blueprints/home.py`. + +You will also notice the lines `Environment: production` and `Debug mode: off` when the Flask application starts in the console. To enable debug mode, you must set the environment variable `ENV` to `dev`, ie: `export ENV=dev` (see `config/config.py` for more details on different environments). + +## Tutorial 1: Adding a new route + + + +## Tutorial 2: Adding database interaction + + +## Tutorial 3: Configuring a test environment \ No newline at end of file diff --git a/app.py b/app.py index 566010b..709de36 100644 --- a/app.py +++ b/app.py @@ -1,15 +1,69 @@ -from flask import Flask, render_template +from flask import Flask, send_from_directory, url_for +from database.db import db +from config.config import APP_NAME, ENV, get_app_config, get_static_url -app = Flask(__name__) +# Create and configure our Flask app +app = Flask(__name__, static_url_path=get_static_url()) +app.url_map.strict_slashes = False +app.config.from_object(get_app_config()) +db.init_app(app) -@app.route('/') -def index(): - return render_template('index.html') +# uri = os.getenv("DATABASE_URL") # or other relevant config var +# print(uri) +# # if uri and uri.startswith("postgres://"): +# # uri = uri.replace("postgres://", "postgresql://", 1) +# # app.config["SQLALCHEMY_DATABASE_URI"] = uri +# # db = SQLAlchemy(app) +# # db.create_all() +# # if db.session.query(User).filter_by(username="testuser").first() is not None: +# # db.session.add(User(username='testuser', email='admin@example.com')) +# # db.session.commit() -if __name__ == '__main__': app.run(debug=True) \ No newline at end of file +# # if db.session.query(Entity).filter_by(username="my entity").first() is not None: +# # db.session.add(Entity(username='my entity', email='entity@example.com')) +# # db.session.commit() + +# # else: +# # print("No database created/linked with this application") + + +# Serve all static assets for the frontend +@app.route('/static/<path:path>') +def serve_static_files(path): + return send_from_directory('static', path) + + +# Register all routes from the blueprints module +from blueprints.home import home_blueprint +from blueprints.auth import auth_blueprint +app.register_blueprint(home_blueprint) +app.register_blueprint(auth_blueprint) + +# @app.route('/test-db') +# def test_db(): +# try: +# rows = "" + +# for user in db.session.query(User).all(): +# rows += str(user) + " " + +# for e in db.session.query(Entity).all(): +# rows += str(e) + " " + +# print("All rows:", rows) +# return rows +# except: +# return "App database error" + +# Hook any custom Jinja templating functions +from config import CUSTOM_TEMPLATE_FUNCTIONS +app.jinja_env.globals.update(CUSTOM_TEMPLATE_FUNCTIONS) + +if __name__ == '__main__': + app.run() \ No newline at end of file diff --git a/auth/__init__.py b/auth/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/auth/constants.py b/auth/constants.py new file mode 100644 index 0000000..bd47363 --- /dev/null +++ b/auth/constants.py @@ -0,0 +1,13 @@ +# LDAP server config +LDAP_URL = "ldaps://ldaps-vip.cc.ic.ac.uk:636" +LDAP_DN = "OU=Users,OU=Imperial College (London),DC=ic,DC=ac,DC=uk" + +# Relevant IC LDAP attributes +TITLE = "extensionAttribute6" +NAME = "givenName" +SURNAME = "sn" +DN = "distinguishedName" +MEMBERSHIPS = "memberOf" + +# List of attributes to be parsed into dictionaries +ATTRIBUTES_TO_SERIALISE = [DN, MEMBERSHIPS] \ No newline at end of file diff --git a/auth/ldap_auth.py b/auth/ldap_auth.py new file mode 100644 index 0000000..f7a1cd7 --- /dev/null +++ b/auth/ldap_auth.py @@ -0,0 +1,43 @@ +from .constants import * +from .ldap_handler import ldap_service + +WHITE_LIST = ["ictsec"] + + +def ldap_login(username, password): + """ + Perform (a) LDAP authentication and (b) additional (app specific) verifications + before granting access and returning the user LDAP attributes 'name, surname, title and memberships'. + """ + ldap_attributes = ldap_service.ldap_login( + username, password, query_attrs=(TITLE, NAME, SURNAME, DN, MEMBERSHIPS) + ) + return custom_authentication_checks(username, ldap_attributes) + + +def custom_authentication_checks(username, ldap_attributes): + # ADD HERE CUSTOM HIGHER-LEVEL CHECKS + # e.g.: + # + # if 'doc' not in dict_attrs[DN]['OU']: # is 'doc' in the organisation sub-attribute? + # if 'doc-all-students' not in dict_attrs[MEMBERSHIPS]['CN']: # is 'doc-all-students' among the memberships? + # raise ldap.INVALID_CREDENTIALS # raise INVALID_CREDENTIALS exception + return ldap_attributes + + +# To enforce a distinction between "student" and "staff", the `ldap_constant_TITLE` ldap attribute is +# requested (see above) and associated to the user model. The following decorator is then an example +# on how to leverage the title to implement title-based access (where DEFAULT_REDIRECTION is assigned +# a convenient application route). +# For inspiration on how to implement title-based access, refer to emarking's source code: +# https://gitlab.doc.ic.ac.uk/edtech/emarking +# +# def role_required(access_role, redirection_url=None): +# def decorator(f): +# @wraps(f) +# def decorated_function(*args, **kwargs): +# if current_user.title == access_role: +# return f(*args, **kwargs) +# return redirect(url_for(redirection_url or DEFAULT_REDIRECTION)) +# return decorated_function +# return decorator diff --git a/auth/ldap_handler.py b/auth/ldap_handler.py new file mode 100644 index 0000000..855af32 --- /dev/null +++ b/auth/ldap_handler.py @@ -0,0 +1,85 @@ +import itertools +import re +from collections import defaultdict + +from .constants import * +import ldap + +# Used to parse key-value LDAP attributes +KEY_VAL_ATT_REGEX = "([A-Za-z0-9]+)=([A-Za-z0-9-@]+)" +USERNAME_FILTER_TEMPLATE = "(&(objectClass=user)(sAMAccountName=%s))" +BINDING_TEMPLATE = "%s@IC.AC.UK" + + +class LdapConnectionHandler: + """ + Adapter for the python-LDAP library. + The class simplifies the interaction with python-LDAP + to initialise an LDAPObject and handle the retrieval of + relevant LDAP user attributes. + + EXAMPLE USAGE FOR LOGIN PURPOSES: + 1. An LDAP object is initialised with LDAP server URL and base distinct name + 2. A new connection is established with connect() + 3. The LDAP binding for a given username and password is performed with ldap_login() + 4. Relevant attributes are queried with query_attributes(). + """ + + def __init__(self): + self.base_dn = LDAP_DN + self.server_url = LDAP_URL + + def ldap_login(self, username, password, query_attrs): + """ + Performs basic LDAP authentication by binding on a fresh connection with `username` and `password`. + Throws INVALID_CREDENTIALS exception if authentication fails. On successful authentication, + retrieves the values stored on the LDAP server associated to `username` for the given `attributes`. + :param username: username credential + :param password: password credential + :param attributes: names of the attributes to filter for + :return: attr_name -> attr_value dict for given username + """ + connection = ldap.initialize(self.server_url) + connection.set_option(ldap.OPT_X_TLS_REQUIRE_CERT, ldap.OPT_X_TLS_ALLOW) + connection.set_option(ldap.OPT_X_TLS_NEWCTX, 0) + connection.simple_bind_s(BINDING_TEMPLATE % username, password) + attributes = parse_ldap_attributes( + self.raw_attributes(username, query_attrs, connection) + ) + connection.unbind_s() + return attributes + + def raw_attributes(self, username, attributes, connection): + ldap_filter = USERNAME_FILTER_TEMPLATE % username + raw_res = connection.search( + self.base_dn, ldap.SCOPE_SUBTREE, ldap_filter, attributes + ) + res_type, res_data = connection.result(raw_res) + _, filtered_attributes = res_data[0] + return filtered_attributes.items() + + +################################################################### +# U T I L I T I E S # +################################################################### +def parse_ldap_attributes(attributes): + return { + k: ldap_attributes_to_dictionary(vs) + if k in ATTRIBUTES_TO_SERIALISE + else vs[0].decode("utf-8") + for k, vs in attributes + } + + +def ldap_attributes_to_dictionary(attr_values): + items = ( + re.findall(KEY_VAL_ATT_REGEX, item.decode("utf-8").replace(",", " ")) + for item in attr_values + ) + d = defaultdict(set) + for k, v in itertools.chain.from_iterable(items): + d[k].add(v) + return d + + +ldap_service = LdapConnectionHandler() diff --git a/blueprints/__init__.py b/blueprints/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/blueprints/auth.py b/blueprints/auth.py new file mode 100644 index 0000000..59362cd --- /dev/null +++ b/blueprints/auth.py @@ -0,0 +1,23 @@ +from flask import Blueprint, render_template, request +from auth.ldap_auth import ldap_login +import ldap + +auth_blueprint = Blueprint('auth', __name__, url_prefix='/auth') + + +@auth_blueprint.route('/login', methods=['GET', 'POST']) +def login(): + if request.method == 'GET': + return render_template('login.html') + + # Handle post request + username = request.form.get('username') + password = request.form.get('password') + print(f'Got username={username} and password={password}') + if username and password: + try: + r = ldap_login(username, password) + return f"Logged in! LDAP response: {r}" + except ldap.INVALID_CREDENTIALS: + return "Invalid credentials." + return "please provide a username and password" \ No newline at end of file diff --git a/blueprints/home.py b/blueprints/home.py new file mode 100644 index 0000000..2b9af5b --- /dev/null +++ b/blueprints/home.py @@ -0,0 +1,35 @@ +from flask import Blueprint, render_template, request, redirect, url_for +from database.db import db +from models.user import Entity + +home_blueprint = Blueprint('home', __name__, url_prefix='/') + +@home_blueprint.route('') +def home(): + return render_template('index.html') + +@home_blueprint.route('/hello/<name>') +def hello(name: str): + return "Hello, " + name + + +# Example CRUD route + +@home_blueprint.route('/entities', methods=['GET', 'POST']) +def entities(): + if request.method == "GET": + try: + rows = "" + for e in db.session.query(Entity).all(): + rows += str(e) + "<br>" + + return rows + except: + return "App database error (have you setup a database for this app?)" + else: + username = request.form.get('username') + email = request.form.get('email') + + db.session.add(Entity(username=username, email=email)) + db.session.commit() + return redirect('/entities') diff --git a/config/__init__.py b/config/__init__.py new file mode 100644 index 0000000..65531fe --- /dev/null +++ b/config/__init__.py @@ -0,0 +1,12 @@ +# Define any custom Jinja2 functions here +from flask import url_for +from .config import URL_PREFIX + +# Get around the routing prefix issue inside the templates +def url_for2(endpoint: str, **kwargs): + return URL_PREFIX + str(url_for(endpoint, **kwargs)) + + +CUSTOM_TEMPLATE_FUNCTIONS = { + "url": url_for2, +} diff --git a/config/config.py b/config/config.py new file mode 100644 index 0000000..c0738ad --- /dev/null +++ b/config/config.py @@ -0,0 +1,50 @@ +import os + +# This should match exactly the name of the app you specified +APP_NAME = "dbtestapp2" +ENV = os.environ.get('ENV', 'prod').lower() +URL_PREFIX = f"/{APP_NAME}" if ENV == 'prod' else "" + +# Get the static URL of the app (to get around the production path issue) +def get_static_url(): + if ENV == 'prod': + return f'/{APP_NAME}/static' + else: + return '/static' + +# Get the app configuration based on the ENV environment variable (default is prod) +def get_app_config(): + if ENV == 'prod': + return ProductionConfig() + else: + return DevelopmentConfig() + + +# If you have created a database for this app, the connection string will be automatically +# accessible through the DATABASE_URL environment variable. +def get_db_url(): + url = os.environ.get('DATABASE_URL') + if url is None: + print("WARNING: Could not connect to the given database URL!") + + # For PostgreSQL databases, the conn string needs to start with "postgresql" + if url and url.startswith("postgres://"): + url = url.replace("postgres://", "postgresql://", 1) + + return url + + +# Flask App settings for production environment +class ProductionConfig: + DEBUG = False + APPLICATION_ROOT = f"/{APP_NAME}" + SQLALCHEMY_DATABASE_URI = get_db_url() + SQLALCHEMY_TRACK_MODIFICATIONS = False + + +# Flask App settings for local development enviroment +class DevelopmentConfig: + DEBUG = True + SQLALCHEMY_DATABASE_URI = get_db_url() + SQLALCHEMY_TRACK_MODIFICATIONS = False + diff --git a/database/__init__.py b/database/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/database/db.py b/database/db.py new file mode 100644 index 0000000..2e1eeb6 --- /dev/null +++ b/database/db.py @@ -0,0 +1,3 @@ +from flask_sqlalchemy import SQLAlchemy + +db = SQLAlchemy() \ No newline at end of file diff --git a/models/__init__.py b/models/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/models/user.py b/models/user.py new file mode 100644 index 0000000..dc40828 --- /dev/null +++ b/models/user.py @@ -0,0 +1,18 @@ +from database.db import db + +# class User(db.Model): +# id = db.Column(db.Integer, primary_key=True) +# username = db.Column(db.String(80), unique=True, nullable=False) +# email = db.Column(db.String(120), unique=True, nullable=False) + +# def __repr__(self): +# return f'User({self.id}, {self.username}, {self.email})' + + +class Entity(db.Model): + id = db.Column(db.Integer, primary_key=True) + username = db.Column(db.String(80), unique=True, nullable=False) + email = db.Column(db.String(120), unique=True, nullable=False) + + def __repr__(self): + return f'Entity({self.id}, {self.username}, {self.email})' \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index 961decf..ee819a9 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,4 +4,8 @@ gunicorn itsdangerous Jinja2 peewee -Werkzeug \ No newline at end of file +Werkzeug +Flask-SQLAlchemy +SQLAlchemy +psycopg2-binary +python_ldap \ No newline at end of file diff --git a/static/img/python-logo.png b/static/img/python-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..7a4bfafc006f4dfa6edee0d25b5efaa5a8edc6fc GIT binary patch literal 50806 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�-5yx{K}?o(-1 z^L?{p$2QH&ulAh&^nkN!d!(7J=y5ZdWB=$i9Nr^ZbJ($bPQ}zK#OV6Kd(V0GVb8RC z;QkZ?4C7rn(F%d2SuJ7cdpNO&s;~21vX0i2h(6{<1wU-Cz`#In4j4@|`lU>GB_F#v z-=+RR3WdUjrPJwqc(Jv{d=xl$wS7t@AKrNL-)fIwBVl|L-#xahM=Pob1cHd$h)iIh z9Xo9GmzpPdst-Wp(6>vetK&*`p{?a5qN#{5*_1aj)vkxCMLQ2(42g=1i_47&soV0M zLP5Qms+@dTB^sTVBY|)di@t$py*48yXU>vxMo35q&Z_}EAZ^fp6RcxjnCua>O!(Tn z!E)MF+$N4>Lkrnsd)D51A8T*}XhA4Me~AwCz@cjUrb@o8ykM|&=s^=~MLQW|&IJ8a zV7jL8&{Ltsdu*4DN<K`cw{+EGGFwSP`XavN&-KTHL<Go;AOu3>MdyOHav_8I)F;+i zBX$C5KL>y6$@X&7JkGc=v|^GDoQ}Q`Tgi7N2-Ti`Dl|Bu!KDnX1}lFOJI>5wnA=Y* z%poSvYe(EIgmd^}n4T*oFxNszRO;%`#B&8hP`krqS3vjZ8?k7r;+%MN-aK*STgOuC z<HVu%;-JP!gLgv<K2xrBRAZgrT8lh@O`+x_R`P|3(b6(ys^OUh7U7vEb{P+YM}+hp z$nm^POznZ9O>eRaLE*z>gR*2aTS5B<=_X)(!17!3)Y9keyKdui$+!5s8_7&bpQeMq z^%<~TiY3mnO1@zQcKryB``Ht7hyg?GQo>$X^*v}6b!-C^%Ghq$71N9K;6v4KEv%!- z3U{od&sb<?UecIAway`qWo~OF{av5CT?$fgdc{!aFRHw6e@VeVu7$ute66G5#9SH8 zk7|@wgPdKX!3@o}VvavIP2<Q;)--<3S>)g)O|7HTEyk1DebDEKQ!7b3HV^8}vYF^7 zyw%vYqUB?mdqwv8Fp3HzDrC1NQJ=-d8T5Nxq|;O6+$PFyfrj1i9K9G|{EC@U(eCeZ zoR}8+uHrwy`Yta~naqF97T#ZyLDSid5d%J?DGQ9}9peh(Pd`*Aaq1y=)neKv-HdW# zgK{DJ91@LgR&sV(iL3Rs2*U^Y_DZ`QPG5jLMI<yXS7{q@iW|6UM!IXEqbXm8XJ@33 z^ED+jxd3s~oRRde`HH(Stbm0`MN?BfxT}92{rJjdq0vxG_eSEFFYWJteO1J*7q|;} zxmdKj9T@T_#lsSx)q&ZSron}cZUmv=3Oj87AHdCwkfl?gENvY<4NT!xVGbkJ>#etM z4VwJ-$nqk&UCr%9r&2u~xIBS)g%v8Yk7C15L+e-CW9!x2aK9M!lsHv0(b%TpHWARv z`lbjJaqMUlhgaty8trbjB%R=6LyW#@h1Z%#-ukm*E|ChN0nh~S*t$uQiY8c?Xfzcw z1ax56X^zYj=)&iNfnRnYCkXwnqerl@Q)v#%AYQEoto$W&;aOL<0pl>)$Xk4rsUsK} z%`A+$fHlgcp8V#LM&VQ1VsD_O<u+noc{)FHBQ%ZUwi$>=-^d30bfOn%-`Zo*+>py8 z&X4_5SVo*eFF`LV3bfn&qM!iamzCVr^c+y?lQ_0~YiY*IhoU!x3!=3bxK-!23^1Ic zgMml`p;!a=AwM=?X|!o=cxOT5$uU~RY{?FEkx}sD{e_cqD;p8H3n`Kau<O?_*^UIf zOm)JAv77zfa@jq^sZWYyJXops3%e*FfUQL^E^?QpM)2qM)Kj5*Y};}{XidqM(e$+* z8{|h1oC^LtXWqM&Sj@gH=J#~;0$uLi>|WUgIj|^j$jM4$a|X)Gr}dEs94~omln1Nt zT1@_}w)StBd#|CWdMF<nS-g9J9WPCrD_wfI=n_!oS@K(LsAsuzr`Cr>|7EP@WU)k= zz2)?fHqae#%UY+Bf5Xh<a#L^=9VjJbJOWbLYXRtu%+I?z5@r@%ddWc`NUC%1F=5&% zx0Mh#PsMk#zY1dk<(L~ED)~(IS~#?)XHrTvM2F@O-z%~s@#;Iy?Bx5c-IOJt-uCYx zl3ufp-U={(e$HZn&ctk@Y-U*yg+Dt$Qbe_oA+|}No@9eFtZBJ{X$7F#i!DuOXbD69 zcBMg$_sjBv$gUF>j=zn;aZ;uH252V*#sG4g9C*WMPRGy$^BQ43$SQk`_A7*aBDfXa zHoTN0dUm??!lpMN;1(qx7@913f!GE2=KrW{?z`m9J-4V<%&1YG#CxZ2l5NsdTbfBK zR;F45WEPOdz}k69xh)_aWMYFj3Mch>JC=)r>ey&fGAv`V6n9hl6PRFE;5`~+Ss;m} zK@jC>7f`oILB1fMFml@@oio`dh{hy;*1X8_K`eu{BI9<k4E8!Wm~X6J&cGwaQ*Ge* zdlubsjk#mI*m=DDZxM`6suW*@((C9gzKlj|6op+Mp`jZ5{vV>Ng*IvGJ-icyE#7UL z*Mgb4s9hSN07#HvU;q{1Ej>QHzOp@sCKg?gr9swXE$*_vJ)-KD0GyTBcZf$fw|1<M z)##deXflON%-OdLtYLz%(6)1vVEN#Irg*2ftOcV$U16K%67$D^QWZAn#LxE(JtX=5 z1eWmIsJI(^ZTuBi^Q{>OIuhV+lBPL$3)OO}g9cPl#871*k)Ms9r`}54<ki$b7qJQC zd1&F0Mtm7bIwSg%$t`^tj*gW@wGu4Dl&J?E`q;~{$r>vc8zyxf#_-(0QGw!9N@O&p zNnQ26Z!Yb^wEtLiQAxd7_cV&|vd`Md1p!wn-Q<Pb-LzH<_GM!o>u3*PWysPGKZIJS zy=S1zIAe(y338swU}9D-pfUsk>ozT}kLV+uY3a-J9vBV~-*}kpqUon!J>eR!Z4vmN zw|<Sz^OCPl9G#mXTRi$u=zo5x5Yh1a@q|j>08d2!q6W+3vN7f+d##3vOef_$%8(bm zA{=Kal=o?RKuOG{Jd>|(mkQ<_87cA9dXsSssVu*QG%-ub=}6}mf9jPz=o`eCYI&E# z)k^K1$~v)x(*y9~T7)^xGH`E4_mlksohh;7@W(C9SHuc+%lYy<mc3<}X|*>i6*ozL zA@D}wuVcV)4u0%Vbh3^<xFZKu1ZONO`W*cmo-jPs>7%t&81QM+N?Lpe{Ipf>m-uu- z@G-h2Jm(;0Zh|<l@VQ!J19r9H&Zyk%UR*i?ppXdUnN0zm-NqPNMEuyMmtUgmqpv#D zF|)yqD@+r}0zL)>N6Zh8(9_~Je{CVQVF}!5qnw10_Oy;J1d!qq{hd}-RlExP>~HgC zA5mGpfw;Xmg$za&zWV~=zF71z=XU&y?s>PRLei#SbEK8n5$l(gim}+yX8{ncHEK)u zNDf7cRMEv+s7YqU(0`_>RPH)rivFa3&aIy;q%4UbosqRPTUkxTCNG4cWX#>-Ytu;T z-Hr|hv$Ecolj1UE`wmrJv}yi-FU3x!CbaxuzJq{+`J1hW9hf?sg!K$bn3ulhlFBTs zhVa_kNefA9lwT&9)Hr4!w4PxF!sFtmvb;cS_6izfHwr>!%4q8KIhtKGEh{Q2pAuv? z&?`5#4}rms5&MCMG;U+<BIdGO7HLl##?Rt@ff=*Gl=nfq09?_GSRu|o?=O~J*_SU_ zIT0CRmglSk0pJ8!z>5!TIGpJEE00<_n9!DIUyg`NeQxlI)!1LuFc!psz#cu|r%Ld- z%yJG0x`q1`7A=%K)pu1~dzJof@G3ZPae)^k^>@o;kX*m#B%TV*%)W?a4$bR)f4+IB z#Ss<XUp5zF*qLu-H1T_F{ZQ=(TnqJG<Tj5cj|8JF$z@7H^2C_ynNOCNOBdmi0+w<T z*9L=jUt`76*&hV_WHV!!uOPYW<p=(1Y<(t~aZA~^Vog>`$3S40pMKHxxMgywlnv~; zz#I88`x;&Nk^xw8S(C)`13(f1^zNI=d2*Qo0HYprmN!(vuP}k{gN+C8t{7<+NJ-)X zDll;+heeTnT}m%l@6*{`C-AX@(dZROR2j+Y;Gyhg0S*YCQ@OwKp30Atvgfe+`%v{S zV^rvcu?eZa*H^%jY~+xW3R$p>C(AQ+7l=71jCrMT4ykyKnHD>>@K()!!j}Q86eyG> z<*vY-k)Jr})~+01rkop?q<wqNXn$@?mmVf71Ho&w_;xJmx7M_$R6K5bE0<H6+lmI@ zhpG=0jka`mtSCU<qFfeS$og*X<E=^CzCs9f#CO0{J3?LGffQr1JvSeuY0ofO?feMi z?(RO~eq=`<O}{h<U~l@7CKg7edM`NXjI?z>o!8TMpfJCdhJI*tEtEJW;Z*uz5}(;7 zH#8XJj)t=W25X1o<VX&?B_?2*+=6ZvbD<M<N=F~tHw2UO3#dc#;_DsN`WJ^-W(g@n z9S2`-5Yiv{_5P_(U#}o`1@}5kHZ;dP{QVh=YM_+i*OzjZVEErkArMP{&6y$SM-o~V zgC!u802~K1^cVAqzAI8jfTXA)uvmjL+x!5N92TE|;mg9PJ(Y5%!@*|QXdnuIby#8F zRS{p+q}Y!V1{#HeUP#ELRylyc1)zbiD?%+bmeN@Tsjk;toS4RdC_qFN&cj<qBxzZ; zr5gIcG5__@+;kO2g)m>QlU1aa(%`z>7)3^cUHhw!pl=<FOUecQ_R4uqnm{E9V}EY| zdy07WRMV%Nk<K)O){zM=(zecE*z#nZMb6g3c?xDS{bsk4TxJLDrgGss#<-Q+=1JPk z8g1?DQyOWT7ilTh`}-!Tn+!l;tLujqIp8XZEt6C+fyLS3@;oW5It1=n#Dh9cb5_8y zHx)PqX@%o?m*7@GU5D1GTjn!x$z$)ev5p+M{3{4;mGCUD+X31HJl@phCKIS@ZBIc@ z>GWN>sx1<v`);mx{=oco?NsKOOm95Zc+64q;^-T4=0{Im1U8^t4Tel=DejOWTaB=Q zHVgO*36Y2JMXh2lx}LQ>-XS&-T&!l=Llpdi)^V61%M*W8IsvnVGfTbh&V2B4T)G9N zkCw*_agt}d7y}a7+P0KV&mMPDNo^_K#!G%srFc!UG3(>lir0M#`$%O8GqHOxHB)X! zc6)H|<ciS5${2_hC#1u(EvH^*Ea7xPZq?Q(Ec&@NEtabjOt!<FPW^LK9eYZ^VL?iO zwB)axH<sh&L6{k7>v%X3a@SC~)ZwZ!W}w6?sFw+l<;pEbi<z+~vbvE&e19!JmL7W= zr$>@ImpS2Uf-_PnoOtX**gIi8+Ur9ss}-({*zfE@o5cV0VY$}o#ukto*2swq6HT84 zCahgNl>=}0Rt-gGVTv&IVlTSsSv*YU84`(ve%dfuPVa3Cqlgv0@cq~GERnFJ0>#Po zA1*A*vmlRzepY#h^*>TjR{b9Tf&6>@XL{8xR=*5=AL5|ae^zOL^{=j((EmeU)ro*o z+}h87E&RV%(qjF49qStSz0S=NL|Oi?jDW0I^vk-0)`*C8SyTR3Ml5UkUm2}NgVm^! z+l@POui;z}lzvya9snBU&7GW_y2}y1i*!m{YiFKqt9WkNARWrK>-jbi>9UJMP*>ap zt=pPqVDLGdT_>3SSxBld2_Do%U9~wDvj#wF>--cs9k;SLcGi2e&1-1_1Lw(KWpCAS zg4?BbJ%TJYcV_C#LoSD|e7li_;dFyb;rm7u?s(sCRHHqoKt$aJRY#|{41A7g9juCK z{azE_+W+Zq#G&=!)&fZGUbuyYg`<PRHP0X4u5k(LUM0eVk-3)=Srj)!^s`oCIgqM` z@F|(XEw%i)W!ob6e~%I`-RIov*{Ei;*PKPTuMt)o&#$3Bi1l5Dz~JxCr&eFEhD`#u zCathmAmYYCz2Ngq9rTOepZ`5EHrOHntLt<!G;V|Rzd!%?eAZL;YHkGMvH%!(5d@3D zdsu~%4F#uHJXL;@@Sp!^%3iyC!7!7_lEx~O{XZ;bPHL5n39P3$xwz>0l99gc+lY12 z`0>@%Q@yFH8s9FpmXTOQD1<|vv(V;xV%zw<sxE{6RXThlSB2CqKzI{+4g#FuvDMG3 zBq<1TtHVzn!JpDeeEsfLmT`_=x_WtwewwQPNU$w1p`;Z?tb%J_nYs|3Lu2_DFSB%O z(*F8YiL)dVHdDUvBh?7+dRZlq{wtFibNI~N<w2(Uov)9)=Eu9Ngz%Q7KA9K(-pLqD z2W6oqAi5p%SFW2CIwn-CDwho=zX#Ubkz+v|qtJlG`Ytpc#Cq8SeEipf{_}H>d8DnL z3+tsk-MNqNQCh&LSjZ}k?xajkl(cAx<Q7MF3kEM!>n8UC8y%U~D0OIkqpjjQ*(1Nr zB(%Iw5YNUXyc?!`7P#XL<h_RH*T}(4WWeG`Rx7(=k6YJy$#tDtV(6OLGf3;X(f0Cb zZ(gisG~eUy?(TqbQjv>A3GlidQUWQ!zpmnDh8wdAorrHtto$?ct;$NTA6p+|VH+_A z(-+XC;WX7(t~QUHZPrR!L1213qAD^k&49vG9q%XGrTK}G2@F~PQpEm=8*dL_S6vvl z93no6d2xw2-c^A39);*((8%zGseMP!$*9eIJF_Zx6DM+Y41cT2R9U=c?9pfF(#aC5 zusv%cq0|Xs-{?MjViicO(qS?ma*51;#aMq1*P+e3Q>rr+`}{8Tx4Z-Z$Z>#_XRDPW z?__NED@Mc$$<DnsY1MH|QY#8QhHAmnSYIKHpyd>tX<-YM{4g_Y_5DfB7*{gx<Lys> z&3-)*=e0zAzotbh_Zhbr>PY3@z?u4_m2y|y!jBXh2E-SWl>&D%xx^c_DuAI`wb`ai zMjV^p$c-OPLrk{dY0EQ>@OEB=ozL<;+x-WaX{(Re&Bh3*7z5je2|=Ot)P7i9qGaj& z!P|!1lMRZ<#aSI@7d`s?>e7Hs*Uf!m8K~tcw->7Za=m_(7+}WUV;$ZL<QN3$g>Rp~ zgOau3F)73TmMuUUN1BstuMOD7sTnU)cvH3dpg^UekT-sb1^%6^;KPc#%|4SoUE*+6 z>==DYec^jN7!XVISzgM;EjlJKd*AAJQqv#0VpM`a4k-I(m`h<rMmE@nT)$Sx1C!KY zu6(fmeA=}Dy*#C#sxZ+Ke7E`4l~vI~u?5Y+a#NH@h!YWQnUu{=5VRO0=Hkckm|*6L zPU=ZQ@Z`_tjQ_s}#JgW#i<e@Mq5m1FZpBq6QKEQUy?0^F=fFIM7W-MD0L_WL+nC0P zdNL&-xyRglnS4ADuqnVj(t#?AS=*)UXshjL0TrLuTej_lnJe%y$LTcMc$eq9NbBV# z5&h=}SpKOF%+7<gD`SI|v%#8`$;9Etboc^o5U#RPUK20E91Pa_A6l9F!worIBa$=` zbr}4AaDPtGX}HBv@erMeA5fgyE=AnMir4K)6@@OOBAvQD5&I55DRS=eco#76&xOBF zr=HyVKW3}G9c^z*h%FzNG#O_4nrQsb(LPsjpBhkEIg=-1LSQbDT=CrhV+jm4SgL|c ziG=+XepNrWq&l`$cZY)Ns^M)lk=|+o^7)Z7cfZ*&RSZ<AmoZG0|I!66{1<YWN^qF{ z*__mkLoNjjA*RY{Ee|+PoObE{=+JBa%G{a|EY+QmD&V_PpQ<<|7r$!dkgcq4j&nb; zc8riZ{*`Th>t_v~{+`+@;P^j1QOk=xdLG17O~{#wMqduT%St=Vphl_bPU4m(vxQPS zHLk2~b}36ktaJk@<6r4#LpxAvgV>+nQ(mpq{a=2f{fo%!oE*s)%HF31)C12=kntK5 zJ;i5SdQ0S8da$xNmZb{7M!!)}@lyc1IDn`cyCwnlK@!FlJ_H9gd#jj;hU0M_xt0ZY z^@iY-K7LA&j*iX{E^x9(iIB^N1SXsN4Zr{Bxktu1<_X5{O&{YJ^CTS?2tP##1-+e3 z1zO4iNzADFDgmrB`)_ICara}@RZ58Y@!21#u5ZL{y?G5{?VF{^Qt4iAqNT&H{!b%| zW4Q*~cJ8}Mv;-wx;S<#0(t&XPmKepp<oo4w9cP_8KX@@2v@C)kLZW=SR(vGhK%JGC zhTd>85z1c7K-t?;aGYxSY>UoF5$V28E`Fs11Qj51Uiia6>MuFr&*{M{{weCnfT18I z$F{d#b&?oZ3E2t-uV$QE@pNaFQ({$Gu<n!=5YLkCHas^g&YJ2iRkXyqeOi!wCoSkh zcrI4iR^~s`V&PhDbU4d)89&pYB0gMR>ThO(wCk@3acKJIg2T_Imm{Fj?EP#4z$uEz zg`uQ`17xLWfQz=82qE2%O?2j+K+e=Fj)1uO4)!raD-I0{R4X<`H4g@hRFW=ns2Q^P za2{FYsz@1GuCCx$90vK>XlHi=!3cO3Ffo+v^PkzpL1R-<zY6ZuJgL3(6?hEhV78-s zWBJIN)Rxa28nEKwYW}$00S&Iyz<Z5pIc4>*54SH2sS6D#HCRdx-%}(9dZwIpxETOk z?X>H4mCBNtIuSR^Dk9bJJ0(s--#~rgj@=V0)Lx9D%hyN860#&Xw<Gv*M;Oc1m&FqQ zQ^s6b8UYz-WS(yi?45`01OAS7bKSE6Bo9HnczwBh75{ffcvQTI0eX>I+D$!#4Pa{C z0XZni_(ULmAR^&mSF3@>3t`>l>(9Or&T*m+-p4cMYe`dnW1I#BlmYYQdp7T5vcB)- zmD1%`aK0*HkXCl+tM0k%si<pC?|(h8g-89_9?ug`7fJIwUZ1Xk&%e{WkW(&Q{myjH zVy`b5O57RKMPhx%+%7>p6ap$2XKwbSGu{r>kXzAy*7dxNTig(vtb1gtOS4p;Q(-dS z7ZS#gi}+qZxxrSIjqx)h?sWX?w9q>t;zoiJUs@s^i?Ca)CXSsC4lcM`KUyG3_#7WQ zbgkHY_Ff2TcwjUxc-b~HPL;VllOV&*HRQ;&%==>hEm<}}_GBN<D^TT5WwS5*dFk$t zRO5G|$55p_>02(}j(dpTmFAD6P9SEZc&+@7u?wk}J>say?HIhEU$ziARrMT>d$SiN zs}$EDWS~M}yVksm*4MM$rmL#Rg_QE@62U(@bv7$K$lTwvnG|B$ubq&^XrGL5R~y;~ zqkb>tL=)4B=;~McM@y>C32qS=K1)?Nsf8UKA;p=RA8~D7Tq<`d&^u>yQGjC~CFlI% z+(yn5nue1X)YyB4%ZT@>$iSY|BMw14!GwZFbqli<(WYPWf&I!s%YJq*Tw!0-7Csbx z`y}4+g211yIo>3zv^*Fky@(XtAq8^WX?TBRgajNpXOwyM2B*jf_0S3!WNb!Jqh4;{ zT)?dTDf@QulP0BAqsgKr&AmusC~XulUcCupKSFj1zAd|Ozm2N;LxSoitd2NfPd{?n zt;*uj+v8kyI<J0RKBLz*XyjwqT%7;h;c%ntds1xS%#9uS<_2ZJHNd;I`bXc&9HICH z;>{B?`|=EXpA^&u0~GsCVj=qCwiv(i>Pvs_-cOxx51sD5Qe%vUnJs9_2_8~x#R}4D z02Y7EC8EFk>{gRvW<UM9`$$VB(%iA*s^rSNUyOi3Ty6JD+s5dl<PH{6F&eMnMhro1 zu9?d|85vb-qKRrLZm(;<FFJ-rA9+`$7({(k5sDdemCS%4oL{znn<<FhMY(a!>>p07 zHf@)d(FfD}iMG?%fAA0}1fgIFyNK9dM-lILLnx^IXo$GNn;5mkBSY_eVO)9NN<~~t zkGNO5fB*Wp_HX>%R2X4859~m!ioSh#CQ?RyVR5J^5`+I?mqd$Cj{CA~1m3ZSxr^{x zH7yxdOnfq*#nVpt@$K0OC?qCT7=5kaPB6B$>3d7=thS0IW($+-xnlhSgofr*7y9_O zWKdj8&gcUqXk7LVH`ifNUxjWNTq+cA3_0K0AA-`|B_q7&hFlwePMWlAv`CIg5Yg!S z-jh4Wj*c-h^34i3WSV(Bwxdxl%bjEjw@|lYt2}>Zy(bM%?~o_l%%v-2h=hX;f${t~ z$8g0zWEWza+J91XqDeR8F<nW~-a%2EB)3^iq}?;&w*r|fb><=Yf|7#zU#vcCz3EBU z=EB-o2C8zpJ)Xyv(+8uB_~|UWJBVF8h_%@pB^uiN)u^V#Q8q2d0)w_DB<+4WS#OEy zyeFYOpg0{WC-_s!{G%v4zrr`ADT)G@xbgb~_S?~m%ujiB2ni#Hr;Nj+?KZD&#WX>9 z0#Ze41vk;_Y193uPx_G#H{^ZmQ{>qdabL*a`Cp(g*p7}|IQbD*E!`N_iEfxzzi~$s z$bNKwSCWfNoZa^3$ddQR|8fdW;@txccFJw;tQ(Tn>+1j%DQu)+kged{*(5{JabA8- zL69_^^U5y}ETT1&uUA{tgTU}o#ua7T$4xXjI!rIp=qtJs)o5Vz&~~=<mBvR7TLaqI zK`{4h#-|(QLtu*}^^MTR`HxM`L?|2A>9ID-r4`Xj_<*_5+M9&VB`1*a6E27*a(uy8 z@2606D)a5?T6&5-#p8Q{^_9u-wTVBfV&2!iy(UeMo#@V#<EM+{r{Bzgbzl7>R<DbY z)H&l0(wsM5nm~<qx;y>7CIR93jlVCL$<TiM`e&SbW9&6wPGJ%?ab_$RFEtk`XI%3w zO|A6)5~a#N+T}!A(Bep~np&b<wc>Tz;mGU<y*Yyq{ja=Fj0}$1wIC}JwW|rFM5#7D z?qjmqfqQ@_>aFzqZJPnDxE<y1r=a`{rQdf7hj`t`IgE0)h^KjIa;FE3^Yi?z<9u3T zRb>e$+^SMJxbKv@%34RO5o(ojUru5Kw+OE&65@p5Y=(JHCz@Vf>b-w1a7a;8wk!6O zg*zGAdyW;A$*+Wi&HYnw&tcv1jOn{Mm*xN#Z2>tX1>kN}?Y4=P_btWKytdY}8RtYe zyE95W%Lx%$g8r{b3vbS!a5I|Vh*i8YcUp|!z<H3{Un1mTsx|CEvBA}SN2y-I!lw(% zLaO46`kWiYz)a`%!1DHqTr|;&!qlm`C?%dC+$k;?uI=E5o48O1t1{VP25NJLLz0)& z()kG6C52n5v?@&$=WU9ZPuY+t_&?TfWXd*N>Z(pkp6!^n;$~XNa>goN0!z&8rXQp| zqg$l;|9F;ye;0)pTfx+MFdtm!x3!S`d=*vz5?QwDbF^K;(B}w_ECUV3$NUTKYJ><Z zFBJTWG|v5{pR)_cciu)Q*>AeNUD&Ho^%$puZH;wKpI_DXlZizjNSQp|W)d6=kIl-9 zQ=2y(alKl+)g*`9L10>K&+a^{^w%iFHvph_nvq8dF&mDs$Se6HQLu_1Yg#VjGu~Me z{<%?uS!PJlQC)u9uBM#0N7HQ1Z|Tv};)AKXuin<VV0w)UJcS6d>WZS5Zal?SJI?)a zPO$T`Jm3V$=5Qfdq3DG3h2vZ%4SFc58su4wL0+9hj^320RIeU;icMsyXS4oQ=c8sQ zq{QGuFV}QImOGzvYcKc`U<jKqeb_{%@RGZ$eKqEiO{)sI$P0<qfe(l76pB9L6xTcc zAWg~h%@3kh4+6x^TLn|`gE3CqQ;zp(3=UkD=zU*B`exdG$ki)*VP}CkVG2-!2~%6f zsJHL7yuPMp<#4KLH%x8u%CC1-@y&j(&f3*J)pn11<(ur6Bfx7RSvd@VBr9Vb#O@*4 zjK|s$k!BB@S}6yGdI;MKI_mb@cG=1+66%|ogQd?*IUg^P1_2J76TLi)Q;!u?OR)+V z$xQjCGiX8Z%eeJ=iSR}*)$!)2TAz(3Rvo$MH86#z-hM4u2a<a}WR*i4u^il<8cGjp z5V~hi*eAUE{9MHsee+5dPv%vX*cjH<X{*T%^FRq9?&if?g(wU`B=HoWlk(mK-&>Bk zA^;y;dLe4~cxEc@p|h@il!CfeMQ&AUqp3R=tvrCNVN<B1`e!`=(bHSBd*TrJm2a=o z$bJW`#`2EsL0L|$oL-ei-h=14C`!73!8dfzP`R#vu&^fB9KNmD)x!#nY_Kbxf1S|w zC&c$U8jg<E$wn&byXUlxrhZIr)8Z~a9xF{n!W!^u=q$es!!|aH*|4{!&r3PJ@a$1D z>r3|xeAsx{V}5~tPXjOx?=mwpKY}@Y7IY;!DGB=&T9*Jp%#Ct1EF3yz6_E>4!!c!D z-B=s{OOx01$Hj%$5@YT^+y-$Ji<c`wnCm$dUe`3oxe3i+n$|a<33dZCUZa8Llv{3W zR&!&P%|gOI>YwYOLkuNClHb?I0FqC&P)h6itVmbNn40M^Q&*kj6*N!jg=qGV5`~^S z3HX(9mUQ<WwHudl4;fy0Bi`|ocE{}RHR;QXq`0Ty0Jg5>T6raar&qt`c`3d}e!RC7 z1M<Ui!61JsY*-bSgwp(gZU_F|Pv5EP%Ng_5xW^t~1+mF7i*K*`f-^KO8;zJ7NsK#% zC;~uK%Yz+E&C;BZ$qPD1yZee$d(G$^n*kqY))n`5=4SSBL2%Cp5_1<ZbqLu1n9`zu z1IE8SAj+(cdMXjCX-9sJ{3B7?D(8Xr;cX^mh4;U(`G@`kc(V38&JU13w;u^XT@OKt z)XCNMSR3bBy_j=wQnijkI<CFR16RK=UeH(qdwBf|g*QY-fn1M-X~rCBpVG5JQ7y1; z)*Y@1k@<H%N)x1U1O5O_70iP}IP~-Vr)wCBzLI}65MzMm0PU$BbYu6);V{N1Dt9fH z8kMsjJ@;W+ZM0nhCOt~s>p7X<l-DMOOU)jp9}JNu(%Nrq#bfLkQRmc$ty~W3d@Zps z7j@&FTH&8*=&>CJIbg>TAf)U$YE=Ce+l-3mrz~=dq#vv)1YXNeXziDaYs_1g^&P5& z*vtDAo!O{+=|~0AyhI-UR)%ip@yp)>3pjV&DG4Bnu}1bx?9th4+cQ$<>$aNjTQPwC zd(Z1z20DIOGRdx%8;a9d!4guJco_66RUdi~H|Or1_`b4iQxkwbuLOv%@YE0W&y~)M zZAU<Sm&vtBygS+>E)%H~yEY~-w};KGrswgm#c9%O!;aR6%AQ8u?<*^Qc|SQX;=05_ zt$$CzwD5;+g7lt?Jz$q;w(<sKs_!kN6wQ<mRnuQ#g!iSjpSGIFf@tyRB<|BUr8iP$ z`Ir9@L-c3!%9tc%-BtQ@1AT6|iZPOv-Z4bKl3X^FXpy}_D+BDVo<;?<n={*LQl9N- ziDJ<t!LEj4;!E^{@#N%hLq}8wL$2xWU%Ywr<vxNmO;A;~h!_y~P>tXrc_Xf==`GiL zyShX>$vfPxJDt3dU!F7`4Zd_V<8E?4A=%_(`QrB1HVfO)PkfTG53BC}rIe2LE)>gL z(~R%LK!gx_HbN8k(zWx$%bWi>N$liL9q*W?SCyYM;d~%&!gF>oRPx?CI+l>G>VLEU z^e2X*!q)~_-;tUu!L3ldvzwH0#WQ?5L{8^@Ils2E7LnA>g1h)Toak*50&u{Yaz8X3 zCrH2@%`hvtYqy|cb5z4;-1M_S=c`w@8|>cXh5c1w6uabVXkFjV0Z8O4z|Rk2N87Dm zrQB}NzLpnXvNl}<#WdGM{>7F|oq`~OH(&@-j^eRCo(ZLKjMpi4l{`p|VGA^1LU+SX zVVTuM`->Mp?UgS31H{a&CTc3WfsdY#ZH=q((rs9CsqN@GjVE{j%L`)40r8nrLrqn5 zwc=p{T1R}zNWL!AWvnB|jO=lRTQvklr;)*)#t>(52ut6N-Z?H)tn<a!s^O2-cz4Rp z()m`Fe!aqEH8yRDensP}kzH;nuIVdRQSyP|Q4ZVc=ywulxUrEMxM+Sw{r*8N?2)|B z<0OnUi7O$NT}Q=)f6e?3Vx{hfK6mQLsZ!w4SfSe{A~A#MUA@AD7!VDnhn2*6&=wed zpb7dxPxg=~gMP=R{alD`L(6G@%%^d#dIlIHxHDmlzngwuokmTSv(x5T0{m@h@4<hX zMVyu9SH|q!aof>@ani*K7kF4~$bSTciGrsK(N9jU1@JdiB`u+-`7c}schrIqw8<Q2 zxAe~|&00e86QPpB2bpxK`+zInYVrxh>{c;1z{;_ATLZ%MiJik$tyCH7zgCr&RN-Bv z!E85y*USBg71B^2qo!&E2NiL1mikWJ?`E@jzq5w>PDa&dqYzXlr7mRKE>M*SLETW% z)%_=&oj=j#QJkK7#$xRHU~^dtz^$Fh4L?+aiW6VP@yWg-4TaXrStBNkhx2=*Y-?Us z7>!d;{m@oAZOn>pMvwN#JE;X}Ev+m~ts(O5XnmLVY@@F1mLcUJ>dw=NSwn7kYBj%} zhIL)BmWApvK=WA@M*UzI8Nl%rR8)z$$vZ|oJ9AIJqe33Q0ubv~Iiy>pf_nyuwO$#T zF||I+9>_MK2|(W2FS3zV7)z}X?KZ(jD7WfAJxM?4>gQTIp}^8u+y3~mOZBk|9^bG2 z9x4i_0jgIwcc5W9eKr#3f|jvt76=4D(*?azfV+`!;|>fg22|OOH36v_)lrX>&Jdck z;sm+Z^{!k9Y9C3$ZdHXTwsL%u3O5w2OFM0(o{U)?r4dju09rDZ$WXk726?Qaixy~5 z>8?!>|1FsbKpu$d^+zTgC_dc{iUswd6T?M56W#A=gBmN;I4Ewi9I9OTTid%^1^cIg z!yWqlda!)#*%0yJv>2*OG8?IiC-ajlU>=<b%GDmwTJ3@Fq4WiWhvmZUq2Rr)*!Fi- z!c}%`FeRNtLeL{&=U_+RZQp#}XEZ`+la;u<M`g%COD-K1-k=0+BJ8w=b+!_#=D)`q zBp!FG@{dF2dnAZ!c#l41v&fnUEa}}+UV^XR#-v{;fBR9NTCfu>8eE24@>v)D*f0<B z)xHpM?M}j63Z?G=mo8UP9jP*GZ$V#_?|3IvX4|Uw3`FQZm88Z&9VhFZ!7pG9`IAge zKnr`D#lg{zQGf)rYUPkoO2bxfp9If_sRnVV&0cS3_5rr_{VYXioC{E*G($$`7mvcb zWm_}=(`BTQcw+%dEQ!lQCDPGC8hzWxBH@52?m)O7`tkM$)gsU43eUYmjt)g^L9yEZ zsEKKx_=B4S%<+1}!-s94sFS~cdge#{M(oh$!Qz&u>zrv}Y3fMVH*BPl)~o{c|GWSw z6_WH>APJ+~{qZxGdhG#Xgld2+8Gy$ISCYqYP4NiVGy0t#uzLb7i?bseaw}KXjZI}H zl=kdh-F&mbhW5aeaPnjJp!g{ZPI@Rhw7hmEEI-x~WQCx$0Nxicmh(OYl`G`A@!Z^A z7}&MLi<T;ZXW3SER7oeA|4{zn&JKNJUCrspc{8BqRz1Z`Q1je)_7odT_Ac3n<kB^{ z7iE&G0NzWRC%N8J`9VdR8qTqtfc54k>qH5&C-QDp+o7<xZYL(!wwfGrdvJ5Gcyg~= zuhi=<VP_?wKdbxhMQ{kQf*|YJW^2G^J(G9462*XR<Ox8+bc#z4s~xL$;VOc!K(*mH zEGV^FKyiQteY7IFK3HFxuPD4*4}D$@4<|#MKoQr>L@oJ)HzP_fII2wg&4$4f;N$A) zDsD(%%$sMZda}-20}JqhZs(|5PlhBM2ix?LhZRp$+yGe%Uws2$>aO)Kg2-0T%K_M5 zAFiVNLHvsMzXeEJm3Y0|(0JT_Pe7A+fhvKWz;`IAY?`6C@Q>ojT@Y|(vrxo~3O|_% z>LEv@Z%j!j7}^LMO4lC7zG}-^pS@9RMWNe3r8DjCKGRf}N*<kM&%QWd(Vo!AEFTvX z_yP8EBjNn_zaGK9F-VtMPm~EK-9TwWn#8ybQ8&)L%b><-cKC#+z!E?Q8_quWQznnB z?ffA5jGNvI<u%TJb-92e&F|&Vj1zRJ?5LNnEgIejOAnlWxOuf;r|AW(2OI@$RGo?5 znDi5<8VU<R?Z<(_3Tqb&MRuDAP*ZVEtN<;YX{u(M1RFWH2Z#p5b~)>U*Vn-xK;r+g z7nUcj-B2+HI%_r?W)zQPt&awutW78+#-1x@K(P}l@v}fudj_;mlwv<Dchadp0EG07 zaQkFC8qg%7d*N9X^0zDgbS9`LMnY+e<q7O1uYUo6#<ESwq_huWLD8%f2wi0o`#Cfx zl?>V!K#1a%wqg-BdJu^Gb8hj^kIe>dAc)MrI!qzNHTo<MvRlTUdJJkg0U$sL1<|b& zE4)Fq=%OG#&z4}!m_m-e%hJ}seJm<6?$b70>MR2xM9+U)tomb0>03uZJSaDxCNcgn zHcY<l-8;C&rUBs|m}-(k!GOKAL^Xh)^1a)G0Uk5bh?Oq;_1B+<9_bbBw*~H!aY(2t zWwvVp@E2=)4K^5X<GLj2Mjwp_vK65@V?0KCJo}<fT>TvYe#(FvSB*KhSoeuI)#ID& zCdaHmcx=rHi(tpzWH5ex=GX{QYRbB*H|iE1-~R|I8W%U|u^Ti}bRa50X4LB}u}2x_ z)cSnO1uYC8tv~PFWUqGtv1jJ`zBvs<pUn<}o2W0IJ|;N(>;nT_@??B)_{{tQ%fHuR z&EP|m$%?ra9ch+DL2M^jp?eGz{JJLD0E9eaJ@!h{^ur${SqNq1D$j3-;xIDrjf!vo zsFU9Ya&r{IzN*qVLsT0`b;W_u`l{;rNusQfg0rbn9IF%?1dIp8D|tV#cpE5M2W|k+ z1W~suc^NQTXjj3#)DP|UQ=elMtSh%~EYM2eZeN*y*EZsFCC`n(c5ny!oJR2^n`;?0 zoXvvQrS_><SFAr=xPQa{69NH-zcCL^DVJ+(Jl4GveUuoig#Z<GNTgJr(?nT7UD6=C z2CVINbbxpAZl2<8CgUT&^(W$1^>;p)pR8?l@(0W2LFH1=e~~XRBaL6a32BQJM@=Fg zKABMZY^?iXJ@G=66j+-J*pTJ>-ilqS1n|5yY%i~FCt9>B7<f6i565a21JgqZxh&JE zX4_19&M#U-LfspzIcK}{cjJSDkI3D*TJ#^c{)#PJMfxtFl-9NNzPxtjh95IbD<4rV zPW6D;@?ws@q0Wr_qxfBdet(e4j}@JiwO+av_0QumQ$nZl1gkWPh65RoT0^zpBWLZe z1BmE9eP_dfLPN$9Osr~rTt8HPpPmOBz`H6P?yL$AOHj(*$)>F@N^fh9i~p9CG!)`B z!0T{A3f3q+Y|M=4MksmrS;DI99HQSG>-KUZuvJ!Y$B)9u+*KzFa&qcJB|Wdv&jnMF z$r~{-Yd=7aQ+L=cWSer~c&l}}oVM<dbeaS0JhdLdd@{Ey<m3DcbUO#nK}psu*7G_3 zC;_VWvt&4GjTn3=lD`uT?6UagL+$n7Lv^b8Z)Y0slxltX-W@9G8deGPst^5nO`|pP z4@Y~TUMj|KnJ#RF>@dIggw1n#>m@Ns^N(+TkzH9LH=<M+N#Bm$tCH9zKgOmGK(gI6 zt%eGDu!kBaNY6(;RCG{U)C9$m8^2C!^_O&qXU+XL)C#-@L9Ij6HHgE6;o<aP+$h0= z{%fEsmi+Qk#A%{SEaEcuM3dsu_A$WrH+Tf@+J7`TRzM|jh@NAbcRWf-{gQnV+X^Tx zo6S+qxpbf1^6opp%NLZt0jONS`^~h(%fVrr3H<Y`RSlS&*ny_U@GDA@d|@E{Is^O< zsF&m+y5_N1*d_^nk|x|)tbI6_riRew$FjD%>rjEgTQ}u7NofDZRRk)&cM*Tnt9ap1 z35%5p=0;^?LrQ3U2moDUUrf{;!M^%ujb2HrNI1>W=plI_4kJ^qYF$^@eX_wsg2;m8 ztN_(!ZKD^2j=U-$+3`9_$?eJ?8=D2G`4FgifaLf9G&G!@2%RV-TGe^LY@ZDl&MR#| zN;#k8&ggSAngs})r@i|lgMTc{46h}y6m_?%DNvQH^T9s|_5sLou)DUfu?w`46$pZM zm{k)QJAzN%{$rno`?is{stHT<Ds{NhR+Eo73Bnrwbo^40P+&f=jYGA`uCP)w{R7l% zQAaHU!LoI-w{&w*0Y#0wr4By0CMWM@8-uK4m%{HXr~tALvGKBDc&yqNWt?K<L!Sb@ zP7m(f6tMlBU+rOlLW$*&BG^HW*Re6_1dWcfZoTdV0kf4@?BR`|%p06%SjNLKnqpna zL%AJ`FbPcWb?5kv5Sy$WZ@l<b8zbT5z6>?%4Y?jx3;4M1i|r$VavtBmN>C;wF+ES_ zCwoa}xr#u}Jyz!)?f#xeXK_t*+tC23DL8+%dhrW%+~qD%`89$9i||>QnOD|5YjFW% z-~1|NqNW|t2%P~Z39>L?czSE?CLlt$*Gm%@mm1<nCP*0KGQH}HB#}G|5W^mr-a)L# zb{b%*E`z~9>Gy>iLV+YV39R4vbfdyzs3Z}0m&HjG@UHIxM!lB7HZQ@2QX4xz+iE}@ zqL%~f=vsM`{GZu3s$~^MeHC*c-I_3_Vh%tZAu)%rgHYq-J$_G0dhbuJB0%h&s>4|1 z4e8{dIo9=oiXxwBRE?K+uDZ<xJrRKYLe90Dm@$h0Yh>K-_!kr`ze^ZA2U0;bZzV$8 z72Sg>McgBPb?pzhis+>K*n#kDAq-u;bcQ4ejmkoo)qv#et!4O#r+p_n2_=|TC(lep z4IWlQ)`4W9=*FsNG7%6n1s-w4R&e8Y?B%(`?+HrST_3oLj#6}0e?{;5yRb}sBd6)( zJ%<}I0U){?Tsl{;NN$^;UulYB(`vxW3iEC?vE79}s&k8S%_lGy+7HHn9aEniXn+BV z)>G^?^ncW0&s8L8QS=&c7<U(pKX!1aZfIH`->AMMv4pb#eC+L{zmbx0WF6`9r*p2+ z^$Cb++HTkoI}B`e8mDD!Kv5J@tXqh9P+qjE$q-2-Juv^Ju(RxBRk<7?`3TC?5s74# zwjrRQ!2}hc$2-}NJY`ID(8$4X8ilt`%wt!bC>2@w;SaY26}Kxgwau<L`ruwj5TIO* zJYh0N!eS)gxH4;DXRv*%@px|Y98H*G?Q+4ZDLni?(6HkCV=CW3GhKls?Pm|v=z8%e zo_;_HmsG=`1p#uIUE`0V=iL6uPdAVKVD-Ji8$?$L@>blh%DvF^AA#xLczZ1IKR@_f z0qarZ1;Am8K_@`^&+JrV#_~N6BUcRseQ_t+UiMQY+l_q>Vp^<iE~aJ-nwyZbyf9B+ z3KCqw9<+=3!*6tPC<(4G{wFX$4a029p&nGuTS!3c=VNnrpx+BZMTeM!*g-|mGVE+y z4LTA}lcN&6D-*{C?tQa7KHE07$O<*$o)95RyR3|Beg;}~rFYKfzv!nYo+hxDOS>W* zk;~@h=BK$9dxCufXM1|(^78k~0CFW~dq+>Z1ZCNaS3S~g*~2;gz%e!TMCmd1lhsd4 zr*NgCgds4!`?dUTv8ViGU*--|qnwlp)dK>OxaNsTm4V|19|p0PFGL+Bd@rZ<p~mL& zAlMvC1a;$-`+ucVE|A-ejdx!i`X%q&KN?7hbbX?nR+;qf^Oyd#QoqZ?L&?Bs#b6P! zSw9NtODB>cwipD|r!MEufo;nv)#_~#=0`EFcA;TpvoD%ikobXcx*?t;<^;9rc%o90 zLnRMUPdC8xXdGzBo%@-?>Q@5=O6zSVg#MMLOB|U-C}X3ccjl7Hx@Eooph?+@N5MwS znp0&KZCUC#oruav|3dn5Zr+anfDJqkY$TNHZsy7DLYtaD&tUEoRK?0ALL_Sjq)f90 zqe7WU6|g0{CI;-b`U<nb{pkJTp~PCXtUhAITE;XIX``NW0F5CgFHUxpe*O|)wKRpt z-zBih?_LqH7`DQ35!tSXZdT!2j{Rk9=oMZ6e9T>sTg~kX0tlc$G78`ewB~*oHC5JD zvm*kT_q05h<D!#$P{xBR=mZ`rjj-qWahMPg2jnPbf0^iBw=HgNKfSemG4u;zoZ4%q zO3iN1!-CTTr|X&`dtOoyugxVNj~zW}^U8g+?cK%wyTN_{r7F-+e!=U+c63z~@4ZwB z1~o1iq*iqJepp_cr169AWkOoyhmP4-RPcFbo}i|dXv8zLYHXlr)D1P=&4Qjhc!4r} zlIx&Ox*)`d*D01b-dOYn{6Xf=CaQ71AcF!RnD$;C2~l069H^nAj}A37hhc+i4`3^k zPTcl-S{xgpu%_Ce8?|cHmCtRjIUhe-WgqDglq6wxvl!>eD5us`6wZgNv2l*c73~WS z-l{c=plo!S%-%j4`i1MGDf&@q3e3cS+g8l{nX*@Gq^FvTZ;!jyP|VHo3B$21#}>b8 z2_X&r`OWIi_lbsxo5P63u@?drc?l4^e*|zUu7p^DuKD57<pXY@(_YQWCYiE)zqh2& zL*FyDkVEy?d1b(mz63pDkleSLSPDPp#MwOIM_e`Zym+{7r)`U%tKQ&4tMZlVw5R__ znn%Pk3>+;Fy+R$FhU(vT&&*ZlVrI-HD7-pOL7=5|cCvKp4T#Des?mxz{gIgKN=fi) z;a((C2VxZLcEhL^<pJJy_-b<rZzlLI`fyqHf(is03w2`IV^lDYPiPq@*6>a&uO;~Q z@+x7UJgQq@55HoFUki~sK`acSA`Nw~CP~As*pzO3JRv+Ww~PSWz%DCkJ5g<5jB!`Y z^m#9c;&w!{v++ur8=CF+9Pi9SNokbje{&0r;^vy8PvOCV1c$*d59Jx*xnLvy@$F#p z%scPd2<Uu6^)4v-egSDH`8@HJhcgUC6&9_op2QVSPDxMx&3X3Kl;%)#Pw*{Onen(a zQVI2Pn~90yU!sEt6szcyj$mh&uti0<kD5zm#?^D$%2_>iYihQ+NRDR|0qf29>$YTC z{=9dK0C|TdIa$W~;;FY<6)~UW7OOzowNe6YZwS{@Uy0e@%PYKP?b~eN7=G8Xyy+K! zzZ_dEXAcAF;-=D}mP&bn(!n5pTl+whLcse6<;Xn5=zv2Qmoi0L0O9C3ulU6(NkAuV zBfIUqPxYAqXMfoLzxJ;DAL^}-->%AXA4#?%bkm}cJY|W}y>*8oq&ti(jU{ELWF2ce z6WyC7*PgOunMv8lRt)#5lwqtfj3~x7i8RRb`HmsYy??;-dOgqib-rgm=X1{aeBST( zG~IKaiZ&s6_m-Jw$#;fGMirVHJl+~mPs#FqA}z$vIwg$wal-xQ(h~i~27J0B4lwub zlQ~QFDMV0i1FY~-G#%IGAS{zsee%uDK>&4ku(mb+s;EGy50sO6MBeamD|Tr^o5wse zRrGOwuud9vIGmM{^T+p?j<qduiDZi`|8lY0#mU5qX>%61igp`y6uWkLQ@0?81WG$d z*r}mlb(xIP^s0jZ!|U4_&9M*_yB(}U#{D<hh$cGJu9KeKGC)X7_o8i`h`sPrL?#{O zdsNc>DZT4=`7+_C5wj1-gUp`ak_jSw467GeSt&BL6nf8yCxS<T5>3LZ#S-{*?4Ozk z%$diEi<CV6*G%9%dBdH}Jc-_;;`-qYnyGs%OCEVVKV_GO_=)TVpe(A0aRoJQCR2R@ zK}dRuS#S=?Q>zJPucWKwbEFw0e9?L1yp%*;D(T;XGxMKO59gWv^`s7L`fo?04-%$> z(9Bm#lOdANS;I`}aF|rpQ@!C>^c)`N@r1ZPtT-_LLz;_-9;e_lyo5-E*`Z)>pP=MR zF5a4dHoHUfBV6zm^flrSIABX3Y@ZGY8^5L*o?bh>nmR|jIj-KIom!`p>C^4CXj)A) zg7OdP%p@>>JpU#b4p6-V_c#`4*b}NQ?+ZJA4$bd$o!>hkRZ5nwKDkE1W-?N1%wf3r zw2DSO?<l6SFW0*_e8Wt{-qboNihPGMGKQFi+gL@r+kpxR=~>2T150p(KU|)yc>&9$ zyIQr^WO?l5Dp!RSn*%8Mv$EbLb;cSA*^Bj+7-kFn9qgt!0O#6Az0QgGLWByeyX1MC zZV7{#&0_TUA;y$1G^bxeiiF@C1WChNWHiX-a@uzCvombOGt6R4HI<2v;I*5qo$1LG z-qEkp6f~56m(rM|<@J6~0JG%+SOG!5n%kbT_H}lDS)WM5eaL~D!f^Kmv+}WqS8w=> zw!qDUpd(-@T{XpM!^rTdHfU@X(y((U9>PuUf3aK>wVK+oUbaXZf&!|vs7&*yQ9z}Z zU6gCSM;ycdCM`BpcWcwHEUCbNePa4F@GV-M*6i%U7V@+KtV*(IfxP3d3sE@(kL4Hb z3^l*}u$q3P({=mq0&PNq*>1nQRJJ*mpaGd+IgDXcX?9smKfht3RUuXjRak14-S_=a zl5*@V)Sr=3L8p7%>cn}O;taTT<%))uKCTVM>fOWOj*jY#2OF>Mh49uf2!@=Wo|LA= z4{8UgFkj}oQ(|y8RiDpn5E{)6R0PL*&ufU9>z9M|xwgyHGp}N;99kFEEdQb<OQgk2 z@J{~>`Dov{gx+^0m=g(V20!gCHR>&+^S^=cnL_##M2Pg6V(?9m^)`Et*to0j^?vFV zoGe!>I+Rf9@h>SgMTDUgqrGtz<Ks}X$)O<XI!ocT3F!-DA4%r*y*+Ph{owBFBwRw5 zP#>Qu%BUKJ@MT4dtx)Z`%~*O@htuY&My1#=^%^GrJJ@jXdcnD5o`{|i<&8pv^kf`x zDKg?t>g*jR9G))lqSp80hR-GZR{yD=su?8h`ep7j_;#rpp^S#(e&{_A{-M(!dQnNf zPlS2CAaFqa5LQ`A><?p|?+(O9k{|4f^idMnQTq#^{N0IHW8~#F)2vabr|ky|ir<w2 zOep*adeS}2uJzWuGT|??%OdaG;1V(fu6<%d(3wI3OSiZHlx67pg!cNH3^O&W=XBNl zS`|V?JLv<U4o9Z07`y|83g8J)_`||H6tCR8(~m%cPQ>0nVjO%ogZx%&?X2064Mr-q zbXk#7c<Bti_L?9Y9BzFV3;_s7aG1w<Za}Hq8hD@hj&4alF#g8&{;N2b`Wr3GXtm0! zo9Yi#9B+EHT@XnD`quVx-4ar(MNVS9^7jF%#L{+a%Z1rr`S6#ez}u;>e|Jw_;v~?~ z6p&|FOmVERp<UN?d71S}$qqpAD}5}geAy@9YLze3woO?Un~58P=mTaGzF#wpS4yR^ zuB0nL{RJ~6V!<$gDE+Ck<O@9>?`|V!O%CT>?BnjAdWXk~fqB!=Ic5f+lX_Xqj<)=_ z@~u<#+Z4=C==Cd|Rul<)Bre-s7sZTg0cb-X#hQ3jf+i6)tbt_;TFp5Z$Tt|r_N&9q zI$m7wHKNs(J&M0!sxn3}FU&p_{iDp)x(`*pS7epO>X{)5WBI~awtn6RN6IdCiE`R- z9HAIByv6S<qm~cSS6yCYgt8f6hzjMXQqMEf$#{Ia_9FF@%`Qr>nP3(c^Bsd6wqa?1 z%OS824LQcQaoCo?$pS`EU%#_EFm#E-s>K%v^pMKg$*310*QcSvJ~*B6%)b`;x5A2c zWeu)vG#00ExR(gc31n$1r>B8IhgL;6Y80-Y5HeF<=aic7gf&+^nw@a+XM0xwy#5V$ zro6nop;!yIhmg^cvW+Wa+Gxj<o!uTaf+nP%48x>h4$~AN@qm&Jwg4hQ7y&CZ!#@E) zf?R!Q0#=MMl`#qo)k}*a3~YuxsQD;&!UoInugJqz^(;4sWQsiQbbDD43{JGxu5=5! z5Qv`ihX7o{a=|_kDb+9us$t{cUCZq(^hQFAS9paq7wNVL!S?RDntF*Ucqf^Rnv=k6 zB`s24mnH*G1NVAP8E+dn7~gUAW^Q`43q!p#0S@!um#bV9C1uXSD<H=|55jre12|Iw zC?FG3BcbXGtKj@A8LkloDkvpR#V*@BDMIFuW?@kgcU$`$szX*m{(l(WIdMg^lT?OF z-?M96tB`#0+3~0yCZm#48Xnf2`F1zB+N-3bWMXBwQA+01$62LsTO`@}sZPorJtc`_ z<P~!*Rjo_!Pf7xfjY=T4Yxn`if~#7T>QkpPSUH_r@2MA$a1~1_MiACg58;FH^2x|= z8}xEi3m`*f3<4?J-_<I3e##NN_um$-N*sr%`%u`<<SbSp;(}jMK7{V#+az#qi=<&f zTJ9WR58khsKA<;wvbMUQ7Kqb67ELm^5tZfKL}F;pnd;2|&6AyCgakwk;u}H{$5QMg zuNp!12Nk$aUuPuH1zA5BTN*flARtr`z1;<cgLwDKMbt}o)}}Sx*KG!H`D07{rt3no z$&HBz`ng*3xs_mLF+~|q>Z%UqQLyjjDngP5&Y5O_P{z9Q+vv{16K~~IKppF_BgDc> zLzGMP(mrPe&6|Lsd+MP-SD%m0ZgoInXvjJ9N~R!<tZtKOl){lrVeht3Jn=#xke>{& z!Sh~{THY=OmrV<d@9U(4t>BQ<*}JBi+!j|kKl>>YTwGh6f4)WNMDX6QA-LMDh@G27 z7)gNc$VKz!+P@C>2H->nIG{CF?7?a>CI}lKCuZLbtm*mvZf{D;uI5HgLrXK^+Qjvx zHWpDkDEIRm5Ns`QY^DJBD;iv4=;9D+DVyX50izX51?b;mGzl7(oR9<OU<P;`F}uGY zq1oBw(-p2@3=9EK;km-#zz~>K`q~vD3}jfMY!)&?z=H|Egd1AIV!S3`+8szN44U^} zUNvk|{4m2AGz_popY79~dI2rdJj3j72J{Vs_0j}uarG(R4W@YGvH?Rp?v-V;2(+KF zCWl}yI%xLfT*Qif0JKap6Jct#{LFw`gb_IJKBM5D>%N`|u+E3ax=23meFA4bKIn!R zc+9|+q~{e{-;S+34dQ1MB)k!y>eU~iZkjFU?P9wm1HfijN?`8=g45Ea?}}-3@@;kV zd4BUnO#?W{uo>(CP1rl|P109SniMKol@&btSwXK!*O3Kh)z{kAOi`6QUdE~1KV?gb zr~S!i89<#TS6To=QU1iANU+QwBF_}$_|IRlnA%KsK7j}^apZ#N^E4Qfw9kkU%rd?| zTzSKEWR)63hYN6@+*b5^I1n#*8r&dvb{Himt`(9|ggLJJ)agv59z2VjK90|>^2cab zxOS<n$duh9yV;0ow~!j=QP&&@vz%P%`$K}3HJQ?BW~&8A^8)a`7dW@=S&^q<fmatl zp$ZGqIcOYK(!hi?`2I0Zt9H5~%*FOcHZi+z=A%78PottUwSC3hX0v$fi}&aM&Uo?1 zzUGO(nl*bW<5_i)(p|)XP^NS{94DBLvR)v25TZS9yKh{vZE`$<JzS2F{3ZtxS5jt| z8_A%T{(KCvD@0b&Fg&G>A&{B@soM8<5pt&eF583KG&~1S41}({7Q~DRX#@I!1=pqK z$ybL{5TCI0b!9v;J$*ZyUwLt)iKgb-iT>QWH&#kVc7zWd36s5;un1yoMfz6aXi4Z{ z=>rabcj>0W7Gz^<x3EnLC=7p19Ek};E&>u)LEqNGk&pQ2f{2bhi*jpl17oMVODZ93 zaSUWlgPmGV9AS;6k2!)O|2>}~GJ{KrLwn{l?(aQ;3(Im^QY2aGC`V_6Gl`=dNxG%a l|35~^IQ_4T5!Nqo;qb<NIGdq<9?S0_9Y-1dLO5c5`9E(0K@|W1 literal 0 HcmV?d00001 diff --git a/templates/index.html b/templates/index.html index 8840789..e83b98f 100644 --- a/templates/index.html +++ b/templates/index.html @@ -1,25 +1,38 @@ <!DOCTYPE html> <html lang="en"> <head> - <title>Heroku Flask Template</title> + <title>Flask Template</title> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> </head> <body> - <h1 id="tittle">Heroku Flask Template</h1> + <h1 id="title">Imperial PaaS - Python Flask Template</h1> <nav> <ul> - <li><a href="index.html">HOME</a></li> - <li><a href="https://github.com/vetronus/heroku-flask-template">SOURCE CODE(GitHub)</a></li> - <li><a href="http://parthsarthee.com/">PARTH SARTHEE(Author)</a></li> - <li><a href="http://aroxbit.com">AROXBIT(Awesome Indie Startup)</a></li> + <li><a href="{{ url('home.home') }}">HOME</a></li> + <li><a href="{{ url('auth.login') }}">LOGIN</a></li> </ul> </nav> - <h2>What is Heroku Flask Template</h2> + + <img src="{{ url('static', filename='img/python-logo.png') }}" width="100px" alt="python logo"/> + + <h2>What is Flask Template</h2> <p> - Heroku Flask Template is a simple web app programmed in Python-3 using flask micro-framework. It is created for begginers to understand the basics of creating a flask web app and deploying it on the Heroku. It can also be used as a template to create your new flask web apps which can then easily be deployable on Heroku. + Flask Template is a simple web app programmed in Python-3 using flask micro-framework. It is created for begginers to understand the basics of creating a flask web app and deploying it on the Heroku. It can also be used as a template to create your new flask web apps. </p><br> - <h3>You can download this plugin, or modify its source code from <a href="https://github.com/vetronus/heroku-flask-template">GitHub</a></h3> + + Example CRUD form: + <form method="post" action="{{ url('home.entities') }}"> + Username:<br> + <input type="text" name="username"> + <br> + Email:<br> + <input type="email" name="email"> + <br> + <button type="submit">Create Entry</button> + </form> + <br> + <a href="{{ url('home.entities') }}">View entities</a> </body> </html> \ No newline at end of file diff --git a/templates/login.html b/templates/login.html new file mode 100644 index 0000000..6771198 --- /dev/null +++ b/templates/login.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<html lang="en"> + <head> + <title>Flask Template</title> + <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1"> + + </head> + <body> + <h1 id="title">Imperial PaaS - Python Flask Template</h1> + <nav> + <ul> + <li><a href="{{ url('home.home') }}">HOME</a></li> + <li><a href="{{ url('auth.login') }}">LOGIN</a></li> + </ul> + </nav> + + <form method="post"> + LDAP Username:<br> + <input type="text" name="username"> + <br> + Password:<br> + <input type="password" name="password"> + <br> + <button type="submit">Login</button> + </form> + </body> +</html> \ No newline at end of file -- GitLab